我希望捕获字符串的某些部分,其中有其他正则表达式分支。如何安全地引用替代路径中的已定义点。我想过要做什么
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
未来可能的正则表达式数量会增长,因此它必须是一般解决方案
答案 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])
(简单地选择包含匹配的组)。