我在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。
谢谢!
答案 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
代码:
\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)