1

我正在尝试制作一个正则表达式,其中我有一些重复的组名,例如,在下面的示例中,我想找到 的值phA这样B如果我在 中替换它们pattern,我就会检索string。我使用 来执行此操作regex,因为 Python 的默认re库不允许重复名称。

pattern = '(?P<ph>.*?) __ (?P<A>.*?) __ (?P<B>.*?) __ \( (?P<ph>.*?) \-> (?P<A>.*?) = (?P<B>.*?) \) \)'
string = 'y = N __ ( A ` y ) __ ( A ` N ) __ ( y = N -> ( A ` y ) = ( A ` N ) ) )'
match = regex.fullmatch(pattern, string)
for k, v in match.groupdict().items():
    print(f'{k}: {v}')

我检索了预期的输出:

ph: y = N
A: ( A ` y )
B: ( A ` N )

我担心的是,这个库似乎有一些问题,或者我没有正确使用它。例如,如果我替换string为: string = 'BLABLA __ ( A ` y ) __ ( A ` N ) __ ( y = N -> ( A ` y ) = ( A ` N ) ) )'

ph那么上面的代码为,A和提供了完全相同的值B,忽略 , 开头的前缀BLABLA应该是因为没有解决方案。stringmatchNone

有任何想法吗?

注意:更准确地说,在我的问题中,我有成对的模式/字符串(p_0, s_0) ... (p_n, s_n),我必须在这些对之间找到一个有效的匹配,所以我用分隔符将它们连接在一起__,但我也很好奇是否有合适的方法来做到这一点。

4

1 回答 1

1

由于您要确保前三个组等于相应的下三个组,您需要使用对前三个组的反向引用,而不是再次使用同名的捕获组:

^(?P<ph>.*?) __ (?P<A>.*?) __ (?P<B>.*?) __ \( (?P=ph) \-> (?P=A) = (?P=B) \) \)$

查看正则表达式演示

这里,(?P=ph)(?P=A)(?P=B)命名的反向引用,它们与捕获到具有相应名称的组中的相同文本匹配。

^$锚在您的代码中不是必需的,因为您使用该方法regex.fullmatch,但是当您在正则表达式测试器中在线测试您的模式时需要它们。

于 2020-08-06T11:13:20.023 回答