【问题标题】:Python 3 regex word boundary unclearPython 3 正则表达式单词边界不清楚
【发布时间】:2025-12-11 01:55:02
【问题描述】:

我正在使用正则表达式来查找字符串“我的车”并在它之前检测到最多四个单词。我的参考文字是:

my house is painted white, my car is red.
A horse is galloping very fast in the road, I drive my car slowly.

如果我使用正则表达式:

re.finditer(r'(?:\w+[ \t,]+){0,4}my car',txt,re.IGNORECASE|re.MULTILINE)

我得到了预期的结果。例如:房子被漆成白色,我的车

如果我使用正则表达式:

re.finditer(r'(?:\w+\b){0,4}my car',txt,re.IGNORECASE|re.MULTILINE)

我只得到:“我的车”和“我的车” 也就是说,在它之前我最多没有四个字。 为什么我不能使用 \b 来匹配组 {0,4} 中的单词?

【问题讨论】:

  • \b 是零宽度断言,它不会匹配你的话后面的空格/逗号等。
  • 单词边界的正则表达式是(?:(?:^|(?<=[^a-zA-Z0-9_]))(?=[a-zA-Z0-9_])|(?<=[a-zA-Z0-9_])(?:$|(?=[^a-zA-Z0-9_]))),也许你能发现你犯的错误。

标签: python regex python-3.x


【解决方案1】:

因为\b 是一个零宽度断言 word boundary 匹配位置 在字符串开头和单词字符之间,在非单词字符和单词 char,介于单词 char 和非单词 char 之间以及单词 char 和字符串结尾之间。 它不会消耗文本

(?:\w+\b){0,4} 只匹配一个空字符串,因为在 my car 之前没有 1+ 个单词 chasrs 后跟单词边界。

相反,您可能想要匹配 1+ 个可以有效模仿单词边界的非单词字符:

(?:\w+\W+){0,4}my car\b

regex demo

【讨论】:

  • 当然,你可以在之后 car使用单词边界,避免匹配carriage
【解决方案2】:

你可以使用:

(?:\b\w+\W+){4}
\b(?:my\ car)\b

a demo on regex101.com


Python 中,这将是:
import re

rx = re.compile(r'''
                (?:\b\w+\W+){0,4}
                \b(?:my\ car)\b
                ''', re.VERBOSE)

string = """
my house is painted white, my car is red.
A horse is galloping very fast in the road, I drive my car slowly.
"""
words = rx.findall(string)
print(words)
# ['house is painted white, my car', 'the road, I drive my car']

【讨论】:

  • 你不能在\w\W之间找到一个单词边界,因此\b\w+\b\W+中是多余的。
  • 是的,根据定义(?<=\W)(?=\w) 是一个单词边界。因此,对于完整的 {4},(?:\b\w+\W+){0,4}\b\w+\W+\b\w+\W+\b\w+\W+\b\w+\W+。那么\W+\b\w+ 等于\W+\w+