使用Python中的Regex从OR运算符中捕获替代字符串?

时间:2014-12-09 10:56:57

标签: python regex

我希望捕获字符串的某些部分,其中有其他正则表达式分支。如何安全地引用替代路径中的已定义点。我想过要做什么

m=re.match("(A(?P<name>.+)B|C(?P<name>.+)D)", text)
match=m.group("name")

但重新定义名称存在冲突。使用索引使用m.group会很麻烦,因为这些正则表达式来自配置文件,我无法保证将导致匹配的嵌套级别/索引值。

编辑: 在设置中有来自不同来源的匹配和正则表达式的文本。我想实现

import re

for text in ["ABBC", "DEEEF", "GHHI"]:
    for regex in ["(A(.+)C|D(.+)F)", "G(.+)I"]:
        m=re.match(regex, text)
        if m:
            print(m.group(1)) # should actually match the middle characters, but doesn't work generally
            break

未来可能的正则表达式数量会增长,因此它必须是一般解决方案

2 个答案:

答案 0 :(得分:0)

可能的解决方案是使用先行断言。如果您将(A(.+)C|D(.+)F)正则表达式替换为

^(?=A.+C$|D.+F$)[A-Z](.+)[A-Z],然后group(1)通常会匹配中间字符。

它说:如果你在一个字符串的开头(^)并且(?=...)中的一个前瞻断言成功,则匹配[A-Z](.+)[A-Z]字符串。

答案 1 :(得分:0)

您的示例可以通过更改

来实现
            print(m.group(1))

            print(filter(None, m.groups())[0])

(简单地选择包含匹配的组)。