在字符串中查找单个或多个词

0 投票
2 回答
1441 浏览
提问于 2025-04-18 09:48

我正在尝试编写一个脚本,用来在给定的字符串中查找一个单词或者由多个单词组成的字符串。我找到了一些答案,感觉很符合我的需求,但我不太明白它是怎么工作的。

根据上面提到的答案中的代码,我得到了这个:

import re

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

st1 = 'those who seek shall find'
st2 = 'swordsmith'

print findWholeWord('seek')(st1)          # -> <match object>
print findWholeWord('these')(st1)         # -> None
print findWholeWord('THOSE')(st1)         # -> <match object>
print findWholeWord('seek shall')(st1)    # -> <match object>
print findWholeWord('word')(st2)          # -> None

这个函数返回的结果要么是像 <_sre.SRE_Match object at 0x94393e0> 这样的东西(表示找到了单词),要么是 None(表示没有找到)。我希望这个函数能返回 TrueFalse,分别表示是否找到了单词。因为我不太清楚这个函数是怎么工作的,所以不知道该怎么做。

我从来没见过一个函数调用时传递两个变量,比如:findWholeWord(word)(string),这是什么意思呢?

2 个回答

1

re是一个处理正则表达式的模块。findWholeWord这个函数会创建一个正则表达式对象,用来匹配你传入的那个单词(模式)。findWholeWord返回的是一个函数;这个函数实际上是正则表达式对象的搜索方法——注意返回语句后面没有'()'。

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

>>> search = findWholeWord('seek')
>>> print search
<built-in method search of _sre.SRE_Pattern object at 0x032F70A8>
>>>

re.search会返回一个匹配对象,如果找到了模式;如果没找到,则返回None。匹配对象的值会被认为是True。

>>> search = findWholeWord('seek')
>>> print search
<built-in method search of _sre.SRE_Pattern object at 0x032F70A8>
>>> 
>>> match = search('this string contains seek')
>>> print match, bool(match)
<_sre.SRE_Match object at 0x032FDC20> True
>>> match = search('this string does not contain the word you are looking for')
>>> print match, bool(match)
None False
>>>

在你的例子中,findWholeWord('seek')(st1)是在调用一个正则表达式的搜索方法,这个正则表达式是用来匹配`seek`的,并且把字符串st1传给了它。

>>> st1 = 'those who seek shall find'
>>> match = search(st1)
>>> print match, bool(match)
<_sre.SRE_Match object at 0x032FDC20> True
>>> match = findWholeWord('seek')(st1)
>>> print match, bool(match)
<_sre.SRE_Match object at 0x032FDC60> True
>>> 
0
if findWholeWord('seek')(st1) == None:
    return False
else:
    return True

或者:

if findWholeWord('seek')(st1): #this is evaluated 'True'
        #do something
else:
        #there is no search match, do something else

或者:

import re

def findWholeWord(w, string):
    pattern = re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE)
    if pattern.search(string):
        return True
    else:
        return False

撰写回答