假设我想搜索出现在行首或出现'a'的'b'。
为什么re.match('[\^a]b','b')
与re.match('^b','b')
不匹配?
更新:我意识到我应该使用search
代替match
。我希望它对'b','cab','ab','bc'和'abd'之类的东西都是积极的。
答案 0 :(得分:16)
正则表达式[\^a]b
将匹配ab
或^b
,因此它不应与字符串'b'
匹配。
请注意,re.match()
仅匹配字符串的开头,就好像您在正则表达式的开头有一个字符串锚点的开头(^
或\A
多行选项已启用)。
所以“要搜索出现在行首或后跟'a'的'b',你需要使用re.search()
和以下正则表达式:
(^|a)b
请注意,我的解释与其他答案略有不同,我认为您的要求意味着您希望匹配'bob'
中的'b'以及{{1 } {}} {}} {}} {}}
此组中的替换方法为您提供了比ab
更具伸缩性的解决方案,因此要匹配字符串开头的'taboo'
或b
之前的a
,{{1 }},^b|ab
或b
您可以使用以下内容:
a
答案 1 :(得分:10)
你的第一个正则表达式真的意味着:
[\^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
字符类只能包含字符。插入符号(^
)特殊含义为匹配字符串开头的零宽度断言在字符类中更改时:如果它的第一个字符或意思是字符插入符号,它可以否定整个字符类({{1如果它被转义或放在别处。