为什么正则表达式"[ \A]abc"在Python中不匹配"abc
我想要匹配一个空格或者字符串的开头,这里用字符串“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",其中 "\A" 是用来表示“只在字符串的开头匹配”。下面的例子中,正则表达式 "[ \A]abc" 可以匹配 " abc"(前面有个空格的情况),但在 Python 中却不能匹配 "abc"(没有空格的情况)。
>>> 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
\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']
0
3
很遗憾,\A
并不表示一个字符或一组字符。所以,它(还有类似的 \Z
)不能放在字符类([]
)里面。如果你把它放进字符类,它会默默地被当作大写字母 A 来处理。
如果你想匹配一个空格或者字符串的开头,可以用另一种方式:(?:\A| )abc
(这里我用了一个不捕获的分组 (?:)
)。