使用\ w的Python正则表达式不起作用

时间:2016-09-12 08:39:41

标签: python regex python-3.x

如果有两个单词,我想要一个正则表达式来找到一个短语和两个单词。 例如,我有字符串(每行一个句子):

  雪佛兰是我的车,而Rusty是我的马。   我的车非常漂亮我的狗是红色的。

如果我使用正则表达式:

re.finditer(r'[\w+\b|^][\w+\b]my car',txt)

我没有得到任何匹配。

如果我使用正则表达式:

re.finditer(r'[\S+\s|^][\S+\s]my car',txt)

我得到: 是我的车'和'。我的车'(我忽略了案件并使用多线)

为什么带有\ w + \ b的正则表达式找不到任何东西?它应该找到两个字和'我的车' 如果有两个单词,怎么能在'我的车'之前得到两个完整的单词。如果我的车前只有一个字,我应该得到它。如果前面没有任何词语,我应该只获得“我的车”。在我的字符串示例中,我应该得到:'雪佛兰是我的车'和'我的车'(这里没有前面的话)

1 个答案:

答案 0 :(得分:7)

r'[\w+\b|^][\w+\b]my car正则表达式中,[\w+\b|^]匹配1个符号,该符号可以是单词char,+,后退空间,|^[\w+\b]匹配1个符号,该符号可以是单词char,+或退格。

重点是在字符类中,量词和很多(但不是全部)特殊字符与文字符号相匹配。例如。 [+]匹配加号,[|^]匹配|^。由于您要匹配序列,因此需要在字符类之外提供一系列子模式。

似乎您打算使用\b作为单词边界,但是,字符类中的\b仅匹配退格符。

找到两个单词和'我的车',您可以使用,例如

\S+\s+\S+\s+my car

请参阅regex demo(此处,\S+匹配一个或多个非空白符号,\s+匹配1个或多个空格,这2个连续子模式的2个匹配项匹配这些符号作为序列)。

要使my car之前的序列可选,只需使用{0,2}量词,如下所示:

(?:\S+[ \t]+){0,2}my car

请参阅this regex demo(与re.IGNORECASE标志一起使用)。见Python demo

import re
txt  = 'Chevy is my car and Rusty is my horse.\nMy car is very pretty my dog is red.'
print(re.findall(r'(?:\S+[ \t]+){0,2}my car', txt, re.I))

<强>详情:

  • (?:\S+[ \t]+){0,2} - 0到2个1+非空格序列,后跟1 +空格或制表符号(您也可以将其替换为[^\S\r\n]以匹配任何水平空格或\s如果你还计划匹配换行符。)
  • my car - 文字my car