假设我想搜索出现在行首或后跟“a”的“b”。
为什么不re.match('[\^a]b','b')
匹配,而匹配re.match('^b','b')
?
更新:我意识到我应该使用search
而不是match
. 我希望它对“b”、“cab”、“ab”、“bc”和“abd”之类的东西是积极的。
正则表达式[\^a]b
将匹配ab
or ^b
,因此它不应匹配字符串'b'
。
请注意,re.match()
仅匹配字符串的开头,就好像您在正则表达式的开头有一个字符串锚的开头(^
或\A
启用了多行选项)。
因此,“要搜索出现在行首或后跟 'a' 的 'b'”,您需要使用re.search()
以下正则表达式:
(^|a)b
请注意,我对此的解释与其他答案略有不同,我认为您的要求意味着您要匹配 'b' in'bob'
以及ab
in 'taboo'
,因此行首要求仅适用于 a 之前b
没有a
.
组中的这种交替方法为您提供了比 更具可扩展性的解决方案^b|ab
,因此要匹配b
字符串的开头或前面的a
, x
, 2
,或者5
您可以使用以下内容:
(^|[ax25])b
你的第一个正则表达式真的意味着:
[\^a]b # match a literal '^' or 'a', followed by a 'b'
你的第二个正则表达式:
^b # match start of line followed by a 'b'
您真正想要的第一个正则表达式是:
^b|ab # match start of line followed by a 'b',
# OR
# an 'a' followed by a 'b'
另请注意re.match()
,自动尝试从开头开始查找匹配项,re.search()
如果要查找出现在字符串中间的字符串,则要使用该匹配项。
假设我要搜索行开头或“a”,或“x”,或“2”或“5”,后跟“b”。我不能
[^ax25]b
代替^b|ab|xb|2b|5b
吗?
在这种情况下,我会这样做:
(^|[ax25])b
字符类只能包含字符。插入符号 ( ^
) 的特殊含义是作为匹配字符串开头的零宽度断言,当它位于字符类中时:它可以否定整个字符类,如果它的第一个字符或意味着文字插入符号 ( ^
),如果它被转义或放置在其他地方。