1

我对正则表达式并不完全陌生,我在很多场合都使用过它们,但大多没有像前瞻之类的“花哨”的东西。我需要一个可以匹配以下两种模式的正则表达式:

  1. PrefTextValue13
  2. PrefText

字符串 'Pref' 总是在那里,我想忽略它。'Text' 是我需要的一个组,它与[\w\d_]+. 字符串“值”应该被忽略,但是当它后面必须跟一个(\d+)我需要作为一个组捕获的数字。“值”和数字都是可选的。

示例:对于案例 1)我需要将“文本”匹配为第 1 组,将 13 匹配为第 2 组;2)我不想只匹配文本。我的尝试(众多尝试之一)是:

re.compile("Pref([\w\d_]+)(Value)?(\d+)?") or 
re.compile("Pref([\w\d_]+?)(?:Value)?(?:?=Value)(\d+)?")

但我做错了。

4

1 回答 1

3

试试这个正则表达式:

re.compile(r'^Pref(\w+?)(?:Value(\d+))?$')

请注意,[\w\d_]与 相同\w

您必须Value\d+集体作为可选。为此,您必须将它们设为一个组。但是由于您不想捕获它们,因此可以使用非捕获组。此外,您可以将其中的\d+零件设为捕获组,以便您可以获取该零件。

问题"Pref(\w+)(?:Value(\d+))?"在于,\w+将匹配所有内容直到最后,并满足正则表达式,因为Value\d+部分是可选的。因此,所有内容都将被捕获在\w+. 所以,你必须让它不情愿 - \w+?

现在,您想要的输出位于group 1group 2中。对于第 2情况,第 2 组将是null

于 2013-08-22T08:40:22.377 回答