如何用正则表达式匹配整个单词?

2024-11-25 08:49:00
admin
原创
182
摘要:问题描述:我无法找到适合以下场景的正确正则表达式:可以说:a = "this is a sample" 我想匹配整个单词 - 例如匹配"hi"应该返回 False,因为"hi"它不是一个单词,并且"is"应该返回 True,因为左...

问题描述:

我无法找到适合以下场景的正确正则表达式:

可以说:

a = "this is a sample"

我想匹配整个单词 - 例如匹配"hi"应该返回 False,因为"hi"它不是一个单词,并且"is"应该返回 True,因为左边和右边没有字母字符。


解决方案 1:

尝试

re.search(r'is', your_string)

来自文档:

匹配空字符串,但仅位于单词的开头或结尾。

请注意,该re模块使用“单词”的简单定义作为“字母数字或下划线字符的序列”,其中“字母数字”取决于语言环境或unicode选项。

还要注意,如果没有原始字符串前缀,则被视为“退格键”而不是正则表达式字边界。

解决方案 2:

尝试使用正则表达式模块中的“单词边界”字符类re

x="this is a sample"
y="this isis a sample."
regex=re.compile(r"is")  # For ignore case: re.compile(r"is", re.IGNORECASE)

regex.findall(y)
[]

regex.findall(x)
['is']

来自 的文档re.search()

匹配空字符串,但仅限于单词的开头或结尾

...

例如r'foo'匹配'foo', 'foo.',但不匹配'(foo)''bar foo baz'`'foobar'`'foo3'

解决方案 3:

我认为,使用给出的答案,原帖作者所期望的行为并没有完全实现。具体来说,布尔值的期望输出没有实现。给出的答案确实有助于说明这个概念,我认为它们很棒。也许我可以通过说明我认为原帖作者使用所用示例是因为以下内容来说明我的意思。

给出的字符串是,

a = "this is a sample"

OP 随后表示,

我想匹配整个单词-例如匹配"hi"应该返回False因为"hi"它不是一个单词...

据我了解,该引用指的是搜索标记,"hi"因为它是在单词中找到的。如果有人在字符串中"this"搜索单词,他们应该会收到响应。a "hi"`False`

OP 继续说道,

...并且"is"应该返回True,因为左侧和右侧没有字母字符。

"is"在这种情况下,引用的是单词 中的搜索标记"is"。我希望这有助于澄清我们使用单词边界的原因。其他答案的行为是“除非该单词单独存在(不在其他单词内),否则不返回该单词。”“单词边界”简写字符类可以很好地完成这项工作。

到目前为止,只有这个词"is"在示例中使用过。我认为这些答案是正确的,但我认为还有更多问题的基本含义需要解决。应该注意其他搜索字符串的行为以理解这个概念。换句话说,我们需要使用 @georg 的答案来概括(优秀)答案。@OmPrakash 的答案也使用了re.match(r"is", your_string)相同的r"is"概念,他通过展示来开始概括讨论

>>> y="this isis a sample."
>>> regex=re.compile(r"is")  # For ignore case: re.compile(r"is", re.IGNORECASE)
>>> regex.findall(y)
[]

假设应该表现出我所讨论的行为的方法名为

find_only_whole_word(search_string, input_string)

那么应该会出现以下行为。

>>> a = "this is a sample"
>>> find_only_whole_word("hi", a)
False
>>> find_only_whole_word("is", a)
True

再次重申,这就是我对 OP 问题的理解。@georg 的回答让我们朝着这个行为迈进了一步,但解释/实施起来有点困难。也就是说

>>> import re
>>> a = "this is a sample"
>>> re.search(r"is", a)
<_sre.SRE_Match object; span=(5, 7), match='is'>
>>> re.search(r"hi", a)
>>>

第二个命令没有输出。@OmPrakesh 提供的有用答案显示了输出,但没有显示TrueFalse

以下是预期行为的更完整示例。

>>> find_only_whole_word("this", a)
True
>>> find_only_whole_word("is", a)
True
>>> find_only_whole_word("a", a)
True
>>> find_only_whole_word("sample", a)
True
# Use "ample", part of the word, "sample": (s)ample
>>> find_only_whole_word("ample", a)
False
# (t)his
>>> find_only_whole_word("his", a)
False
# (sa)mpl(e)
>>> find_only_whole_word("mpl", a)
False
# Any random word
>>> find_only_whole_word("applesauce", a)
False
>>>

这可以通过以下代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#@file find_only_whole_word.py

import re

def find_only_whole_word(search_string, input_string):
  # Create a raw string with word boundaries from the user's input_string
  raw_search_string = r"" + search_string + r""

  match_output = re.search(raw_search_string, input_string)
  ##As noted by @OmPrakesh, if you want to ignore case, uncomment
  ##the next two lines
  #match_output = re.search(raw_search_string, input_string, 
  #                         flags=re.IGNORECASE)

  no_match_was_found = ( match_output is None )
  if no_match_was_found:
    return False
  else:
    return True

##endof:  find_only_whole_word(search_string, input_string)

以下是一个简单的演示。从保存文件的同一目录运行 Python 解释器find_only_whole_word.py

>>> from find_only_whole_word import find_only_whole_word
>>> a = "this is a sample"
>>> find_only_whole_word("hi", a)
False
>>> find_only_whole_word("is", a)
True
>>> find_only_whole_word("cucumber", a)
False
# The excellent example from @OmPrakash
>>> find_only_whole_word("is", "this isis a sample")
False
>>>

解决方案 4:

正则表达式的问题在于,如果您想在另一个字符串中搜索的字符串包含正则表达式字符,则会变得复杂。任何带有括号的字符串都会失败。

此代码将找到一个单词

 word="is"
    srchedStr="this is a sample"
    if srchedStr.find(" "+word+" ") >=0  or \n       srchedStr.endswith(" "+word):
        <do stuff>

条件的第一部分搜索两边都有空格的文本,第二部分捕获字符串结尾的情况。请注意,endwith 是布尔值,而find返回一个整数

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用