正则表达式中的OR'ed反向引用

时间:2013-03-02 20:56:31

标签: python regex backreference

有人可以解释这个正则表达式应该如何工作:

^(a)|\1$

我把它解释为:

* 1。字符串的开头,

接下来是:

* 2。之一:

* 2a上。 a

或:

* 2b中。之前匹配的(a)

接下来是:

* 3。字符串结尾

但是,2b是不可能的,因为如果选择2b超过2a,则之前没有匹配的(a)组。因此,解释等同于:

* 1。字符串的开头,

接下来是:

* 2。 a

接下来是:

* 3。字符串结尾

换句话说,正则表达式只相当于:^a$(也可以说OR'ed反向引用是无意义的。)

然而,在Python中我得到:

>>> import re

>>> re.findall(r'^a$', r'aa')
[] # as expected

>>> re.findall(r'^(a)|\1$', r'a')
['a'] # as expected

>>> re.findall(r'^(a)|\1$', r'aa')
['a'] # NOT as expected

aa如何与^(a)|\1$匹配?

1 个答案:

答案 0 :(得分:0)

这实际上是一个无法访问的正则表达式代码:

原则上,这会匹配行开头的单个a或行尾的单个a当且仅当一个a位于行的末尾时线的开始已经匹配。但是,由于在行的开头匹配单个a意味着匹配已经完成,因此永远不会到达正则表达式的第二部分,并且将始终返回第一个a

我猜你有一个更复杂的群体,而不仅仅是“a”,所以这里有一个匹配短语a,第二个a(可选),然后结束这一行:^(a)\1?$

这意味着“在行的开头匹配a,然后允许另一个foo(如果它在那里),然后是字符串的结尾,其中a可以是任何正则表达式模式。如果{ {1}}实际上只是字母“a”,然后a是一个更简单的替代方案。

如果您只想匹配从^aa?$开始或以a结尾的任何整行,那么^(a.*|.*a)$将起作用,如果使用单行模式,则为^(a[^\n]*|[^\n]*a)$,简化为{{1支持^(a.*?|.*?a)$运算符的正则表达式。不幸的是,在这种情况下,*?的模式必须写在整个模式的开头和结尾,因为反向引用不会起作用。如果a是带有a运算符的模式,请将其括在|等括号中。