为什么正则表达式" [\ A] abc"没有匹配" abc"在python中

时间:2014-08-11 02:02:11

标签: python regex

我想匹配一个空格或一个字符串的开头,使用字符串" abc"演示:

"abc_some_words" match for "abc" at the start of the string
"some_words abc_some_words" match for there is a space before "abc"
"Aabc" don't match for there is a "A" before "abc"

所以我写了正则表达式" [\ A] abc" for" \ A仅在字符串的开头匹配"。如下所示,regex" [\ A] abc"比赛" abc",但没有匹配" abc"在python中。

>>> re.search(r"[ \A]abc", "babc")
>>> re.search(r"[ \A]abc", "abc")
>>> re.search(r"[ \A]abc", " abc")
<_sre.SRE_Match object at 0xb6fccdb0>

3 个答案:

答案 0 :(得分:3)

不幸的是,\A不代表一个字符或一组字符。因此,它(和类似的\Z)不能在字符类([])中使用。如果你把它放在一个字符类中,那么它将被默默地视为大写A.

要匹配空格或字符串的开头,您可以使用替换:(?:\A| )abc(我使用非捕获组(?:))。

答案 1 :(得分:0)

如果要匹配字符串的开头,可以使用锚^。所以,如果你想在开头或abc有一个空格,你可以使用这个正则表达式:

^\s?abc

<强> Working demo

答案 2 :(得分:0)

\A - 字符串的开头是\Z的镜像 - 字符串结尾。

^$的含义可以通过re.M标志进行修改。它们可以表示^的字符串的开头或每行的开头; $可以是字符串的结尾或每行的结尾 - 取决于re.M标记。

但是,\A明确地表示字符串的开头,而\Z明确地表示字符串的结尾。

假设你有字符串:

txt='''\
1 ABC
2 ABC
3 ABC
4 ABC'''

要在每行开头匹配ABC,您可以这样做:

>>> re.findall(r'^\d\sABC', txt, re.M)
['1 ABC', '2 ABC', '3 ABC', '4 ABC']

但如果您只想要第一行和最后一行,您可以这样做:

>>> re.findall(r'\A\d\sABC|\d\sABC\Z', txt, re.M)
['1 ABC', '4 ABC']