Python正则表达式匹配整个单词

时间:2013-04-07 13:44:01

标签: python regex

我无法为下面的场景找到正确的正则表达式:

让我们说:

a = "this is a sample"

我希望匹配整个单词 - 比如匹配"hi"应该返回False,因为"hi"不是单词而"is"应该返回True,因为左边没有字母字符,在右边。

4 个答案:

答案 0 :(得分:36)

尝试

re.search(r'\bis\b', your_string)

来自the docs

  

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

请注意,re模块使用“word”的简单定义作为“字母数字或下划线字符序列”,其中“字母数字”取决于区域设置或unicode选项。

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

答案 1 :(得分:2)

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

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

regex.findall(y)
[]

regex.findall(x)
['is']

来自re.search()的文档。

  

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

     

...

     

例如r'\bfoo\b'匹配'foo''foo.''(foo)''bar foo baz'但不匹配'foobar''foo3'

答案 2 :(得分:0)

我认为,使用给出的答案并不能完全实现OP期望的行为。具体来说,没有实现所需的布尔输出。 do 给出的答案有助于说明这一概念,我认为它们很棒。也许我可以通过说明我认为OP使用以下示例来说明我的意思。

给出的字符串是

  

a = "this is a sample"

然后,OP声明

  

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

据我了解,引用是在单词"hi"中找到的搜索令牌"this"。如果有人要在字符串a中搜索单词 "hi",则他们应该收到False作为响应。

OP继续,

  

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

在这种情况下,引用是在单词"is"中找到的搜索令牌"is"。我希望这有助于弄清为什么我们使用单词边界。其他答案的行为是“除非单词本身被发现-不在单词内部,否则不要返回单词”。 “单词边界” shorthand character class很好地完成了这项工作。

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

>>> y="this isis a sample."
>>> regex=re.compile(r"\bis\b")  # For ignore case: re.compile(r"\bis\b", 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"\bis\b", a)
<_sre.SRE_Match object; span=(5, 7), match='is'>
>>> re.search(r"\bhi\b", 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"\b" + search_string + r"\b"

  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)

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

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

答案 3 :(得分:-5)

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

此代码会找到一个单词

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

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