有人可以解释这个正则表达式应该如何工作:
^(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$
匹配?
答案 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
运算符的模式,请将其括在|
等括号中。