我不是全新的正则表达式,我已经在很多场合使用过它们,但大多数都没有像前瞻之类的“花哨”的东西。 我需要一个可以匹配以下两种模式的正则表达式:
PrefTextValue13
PrefText
字符串'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+)?")
但我无法做对。
答案 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
。