1

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

^(a)|\1$

?

我将其解释为:

*1。字符串的开头,

其次是:

*2。任何一个:

*2a。一个a

或者:

*2b。先前匹配的(a)组,

其次是:

*3。字符串结尾

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

*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$

4

1 回答 1

0

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

原则上,当且仅当已经匹配了行首的单个a时,这匹配行首的单个或行尾的单个。但是,由于在行首匹配单个意味着匹配已经完成,因此永远不会到达正则表达式的第二部分,而只会返回第一部分。aaaa

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

这意味着“a在行首匹配,然后允许另一个 foo(如果它在那里),然后是字符串的结尾,其中a可以是任何正则表达式模式。如果a真的只是字母“a”,那么^aa?$是一个更简单的选择.

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

于 2013-10-20T19:33:35.623 回答