非贪婪组后面的可选组

时间:2013-08-22 08:36:48

标签: python regex

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

  1. PrefTextValue13
  2. PrefText
  3. 字符串'Pref'总是存在,我想忽略它。 “文字”是我需要的一组,并由[\w\d_]+匹配。字符串'Value',当应该被忽略时,但是当它出现时必须跟一个我需要作为一组捕获的数字(\d+)。 “价值”和数字都是可选的。

    实施例: 对于情况1)我需要将'Text'与组1和13匹配为组2; 2)我不想只匹配文字。 我的尝试(其中之一)是:

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

    但我无法做对。

1 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

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

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

您必须将Value\d+统称为可选项。为此,你必须让他们成为一个团体。但由于您不想捕获它们,因此可以使用非捕获组。此外,您可以将\d+部分作为捕获组,以便您可以获得该部分。

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

现在,您所需的输出位于组1 组2 中。对于2 nd 的情况, group 2 将是null