为什么正则表达式"[ \A]abc"在Python中不匹配"abc

1 投票
3 回答
637 浏览
提问于 2025-04-18 16:47

我想要匹配一个空格或者字符串的开头,这里用字符串“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

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

^\s?abc

可以试试这个示例

3

很遗憾,\A 并不表示一个字符或一组字符。所以,它(还有类似的 \Z)不能放在字符类([])里面。如果你把它放进字符类,它会默默地被当作大写字母 A 来处理。

如果你想匹配一个空格或者字符串的开头,可以用另一种方式:(?:\A| )abc(这里我用了一个不捕获的分组 (?:))。

撰写回答