正则表达式行开头的字符集

时间:2012-11-02 16:15:44

标签: python regex

假设我想搜索出现在行首或出现'a'的'b'。

为什么re.match('[\^a]b','b')re.match('^b','b')不匹配?

更新:我意识到我应该使用search代替match。我希望它对'b','cab','ab','bc'和'abd'之类的东西都是积极的。

2 个答案:

答案 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|abb您可以使用以下内容:

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如果它被转义或放在别处。