Python正则表达式单词距离

时间:2016-01-17 19:08:23

标签: python regex

我在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 个答案:

答案 0 :(得分:1)

您可以在正则表达式中的两者之间添加(?:\W+\w+){0,10}\W+子模式:

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

请参阅regex demo

正则表达式解释:

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

所以,你的代码看起来像

simple

请参阅Python demo

如果单词的位置可以是,则需要添加替代字词:

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

Another demo

代码:

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

答案 1 :(得分: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
>>>

答案 2 :(得分:0)

尝试以下正则表达式:

r'\bHello\s+(\S+\s+){0,10}simple\b'

示例:from this site