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

use*_*386 2 python regex python-3.x

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

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

如果我使用正则表达式:

re.finditer(r'[\w+\b|^][\w+\b]my car',txt)
Run Code Online (Sandbox Code Playgroud)

我没有得到任何匹配.

如果我使用正则表达式:

re.finditer(r'[\S+\s|^][\S+\s]my car',txt)
Run Code Online (Sandbox Code Playgroud)

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

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

Wik*_*żew 7

在您的r'[\w+\b|^][\w+\b]my car正则表达式,[\w+\b|^]匹配1个符号,它可以是一个单词字符,一个+,一个backdpace,|^[\w+\b]1个符号,它可以是一个单词字符,或匹配+,或退格.

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

看起来好像你打算\b用作单词边界,但是,\b在一个字符类中只匹配一个退格字符.

例如,要查找两个单词和"我的车",您可以使用

\S+\s+\S+\s+my car
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示(此处,\S+匹配一个或多个非空白符号,并\s+匹配1个或多个空格,并且这2个连续子模式的2个匹配项将这些符号作为序列匹配).

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

(?:\S+[ \t]+){0,2}my car
Run Code Online (Sandbox Code Playgroud)

请参阅此正则表达式演示(与re.IGNORECASE标志一起使用).参见Python演示:

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))
Run Code Online (Sandbox Code Playgroud)

细节:

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