21

假设我想搜索出现在行首或后跟“a”的“b”。

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

更新:我意识到我应该使用search而不是match. 我希望它对“b”、“cab”、“ab”、“bc”和“abd”之类的东西是积极的。

4

2 回答 2

24

正则表达式[\^a]b将匹配abor ^b,因此它不应匹配字符串'b'

请注意,re.match()仅匹配字符串的开头,就好像您在正则表达式的开头有一个字符串锚的开头(^\A启用了多行选项)。

因此,“要搜索出现在行首或后跟 'a' 的 'b'”,您需要使用re.search()以下正则表达式:

(^|a)b

请注意,我对此的解释与其他答案略有不同,我认为您的要求意味着您要匹配 'b' in'bob'以及abin 'taboo',因此行首要求仅适用于 a 之前b没有a.

组中的这种交替方法为您提供了比 更具可扩展性的解决方案^b|ab,因此要匹配b字符串的开头或前面的a, x, 2,或者5您可以使用以下内容:

(^|[ax25])b
于 2012-11-02T16:24:02.817 回答
14

你的第一个正则表达式真的意味着:

[\^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

字符类只能包含字符。插入符号 ( ^) 的特殊含义是作为匹配字符串开头的零宽度断言,当它位于字符类中时:它可以否定整个字符类,如果它的第一个字符或意味着文字插入符号 ( ^),如果它被转义或放置在其他地方。

于 2012-11-02T16:19:35.683 回答