为什么Python中的正则表达式“\ bpattern \ b”行为不一致?

时间:2016-02-24 18:28:10

标签: python regex

我正在使用Python 3进行演示。有一个示例字符串:

a =“学习就是学习,才能学会”

s =“@wen is @ and wen @”

我想完全匹配“学习”和“@”,即不提取学习(或@wen)或elearn(或wen @)。因此,我应该'学习'和'@'。

re.findall(r'\blearn\b', a) # works
['learn']

or

re.sub(r'\blearn\b', 'z', a) # works
'learning is z and elearn'


re.findall(r'\b@\b', s) # not working
[]

or

re.sub(r'\b@\b', 'z', s) # not working
'@wen is @ and wen@'

1 个答案:

答案 0 :(得分:2)

来自the docs

  

\b匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符表示。请注意,正式地,\b被定义为\w\W字符之间的边界(反之亦然),或\w与字符串的开头/结尾之间的边界

在您的示例中,@是由其他非字母数字字符包围的非字母数字(和非下划线)字符。由于没有单词字符,因此没有单词边界,因此\b将不匹配。