如果有两个单词,我想要一个正则表达式来找到一个短语和两个单词。 例如,我有字符串(每行一个句子):
雪佛兰是我的车,而Rusty是我的马。 我的车非常漂亮我的狗是红色的。
如果我使用正则表达式:
re.finditer(r'[\w+\b|^][\w+\b]my car',txt)
我没有得到任何匹配。
如果我使用正则表达式:
re.finditer(r'[\S+\s|^][\S+\s]my car',txt)
我得到: 是我的车'和'。我的车'(我忽略了案件并使用多线)
为什么带有\ w + \ b的正则表达式找不到任何东西?它应该找到两个字和'我的车' 如果有两个单词,怎么能在'我的车'之前得到两个完整的单词。如果我的车前只有一个字,我应该得到它。如果前面没有任何词语,我应该只获得“我的车”。在我的字符串示例中,我应该得到:'雪佛兰是我的车'和'我的车'(这里没有前面的话)
答案 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
。