Python正则表达式中单词距离的匹配

3
我在Python中有以下代码,它可以查找文本中的整个单词。
def findWholeWord(w):
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search

现在,如何通过正则表达式找到一个单词与另一个单词之间的范围内是否有10个单词,例如,假设我有以下字符串:
“Hello,World!程序是一种计算机程序,它在显示设备上输出“ Hello,World!”,大多数编程语言中都是非常简单的程序,通常用于向初学者演示构建工作程序的基本语法。它还用于验证语言或系统是否正常运行。”
如果我传递单词Hello和simple,它应该匹配,因为它们之间的单词数是<= 10。
谢谢!
3个回答

3
你可以在正则表达式中的这两个之间添加一个 (?:\W+\w+){0,10}\W+ 子模式:
\bhello(?:\W+\w+){0,10}\W+simple\b

请查看正则表达式演示

正则表达式解释:

  • \bhello - 匹配整个单词 hello
  • (?:\W+\w+){0,10} - 匹配 0 至 10 个由一个或多个非单词字符(标点符号、空格等)后跟着一个或多个单词字符(\w 匹配 [a-zA-Z0-9_] 或所有 Unicode 字母和数字,如果提供了 re.U 标志)的序列,然后...
  • \W+ - 匹配一个或多个非单词字符(标点符号、空格等)
  • simple\b - 匹配整个单词 simple

因此,你的代码将如下所示:

def findWholeWord(w1,w2):
    return re.compile(r'\b{0}(?:\W+\w+){{0,10}}\W+{1}\b'.format(w1,w2), flags=re.IGNORECASE).search

请参见Python演示

如果单词的位置可以是任意的,你需要添加一个替代方案:

\bhello(?:\W+\w+){0,10}\W+simple\b|\bsimple(?:\W+\w+){0,10}\W+hello\b

另一个演示

代码:

def findWholeWord(w1,w2):
    return re.compile(r'\b{0}(?:\W+\w+){{0,10}}\W+{1}\b|\b{1}(?:\W+\w+){{0,10}}\W+{0}\b'.format(w1,w2), flags=re.IGNORECASE).search

1
太完美了!这正是我所需要的。谢谢! - Cristiano Ornelas

2

\w+\s+?(其中 \s+?\s+ 相同)无法处理标点符号。 - Wiktor Stribiżew

1
首先进行假设检查。您的findWholeWord()函数返回一个方法而不是模式,因此我猜测它应该像这样被调用:
>>> match_result = (findWholeWord("boy"))("Oh boy how complicated!")
>>> match_result.group(0)
'boy'

通常我们会返回一个模式,然后可以应用不同的搜索方法。你所做的是有效的,但限制了你只能使用一种方法。
现在让我们讨论\b(和伴侣\B)。\b操作符匹配单词边界,就像你发现的那样。但关键概念在于什么是“单词”。答案是非常狭窄的集合[A-Za-z0-9_]——“单词”不是自然语言单词,而是计算机语言标识符。\b操作符更多地存在于语言本身的解析器而不是你的使用中。
这意味着它不能处理常见的英语情况,例如:
>>> match_result = (findWholeWord("won"))("I won't do it")
>>> match_result.group(0)
'won'

没有简单的答案适用于所有英语,无论你想出什么模式,都会有例外。你需要弄清楚你正在尝试解决的问题的限制。

回到你最初的问题,一个近似的解决方案:

def findSeparatedWords(w1, w2, distance):
    return re.compile(r'(\b{0}\b)(\b[^\b]+\b){2}(\b{1}\b)'.format(w1, w2, "{" + str(distance) + '}'), flags=re.IGNORECASE).search

>>> match_result = (findSeparatedWords("Hello", "simple", 3))("Hello, World! is a simple computer program.")
>>> match_result
<_sre.SRE_Match object; span=(0, 25), match='Hello, World! is a simple'>
>>>
>>> match_result = (findSeparatedWords("Hello", "simple", 10))("Hello, World! is a simple computer program.")
>>> match_result
>>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接