Python正则表达式单词Distan

2024-06-28 19:16:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了下面的代码,用于查找文本中是否有一个完整的单词。在

def findWholeWord(w):
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search

现在,如果一个单词与另一个单词之间的范围在10个单词之间,那么正则表达式如何查找呢?例如,假设我有以下字符串:

“你好,世界!程序是一个输出“你好,World!”在显示设备上。在大多数编程语言中,它是一个非常简单的程序,经常被用来向初学者演示构造一个工作程序的基本语法。它还用于验证语言或系统是否正常运行。”

如果我传递单词Hello和simple,它应该匹配,因为它们之间的单词数是<;=10。在

谢谢!在


Tags: 字符串代码文本程序reformatsearchreturn
3条回答

首先是假设检验。您的findHoleWorld()函数返回的是方法而不是模式,所以我猜它应该这样调用:

>>> match_result = (findWholeWord("boy"))("Oh boy how complicated!")
>>> match_result.group(0)
'boy'

通常我们会返回一个模式,在这个模式上我们可以应用不同的搜索方法。你所做的是有效的,但却把你锁在一个方法上。在

现在让我们来讨论\b(和同伴\b)。\b运算符与您发现的单词边界相匹配。但关键是“概念”。答案是非常狭窄的集合[A-Za-z0-9_9]“单词”不是一个自然语言单词,而是一个计算机语言标识符。\b运算符的存在更多的是为了语言本身的解析器,而不是供您使用。在

这意味着它不能处理常见的英语情况,例如:

^{pr2}$

没有一个简单的答案适用于所有的英语,无论你想出什么样的模式,都会有例外。你需要弄清楚你要解决的问题有哪些局限性。在

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

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
>>>

您可以在regex中的这两者之间添加(?:\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字母和数字,如果提供了re.U标志),然后是。。。在
  • \W+-一个或多个非单词字符(标点符号、空格等)
  • simple\b-一个完整的单词simple

所以,你的代码看起来像

^{pr2}$

Python demo

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

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

Another demo

代码:

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

请尝试以下正则表达式:

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

示例:https://regex101.com/r/oL7tN8/4

相关问题 更多 >