0

这是我需要帮助的一段代码。

listword=["os","slow"]
sentence="photos"
if any(word in sentence for word in listword):
    print "yes"

它打印是,因为照片中存在 os。但是我想知道字符串中是否存在os 作为“单词”而不是 os作为单词的一部分存在。有没有办法不将句子转换为单词列表。基本上我不希望程序打印是.只有当字符串包含 os word时,它才必须打印 yes 。

谢谢

4

5 回答 5

2

您需要使用正则表达式,并\b在匹配时在每个单词周围添加单词边界锚点:

import re

if any(re.search(r'\b{}\b'.format(re.escape(word)), sentence) for word in listword):
    print 'yes'

边界锚点匹配字符串的\b起点和终点,以及在单词和非单词字符之间存在过渡的任何地方(例如在空格和字母或数字之间,或在标点符号和字母或数字之间)。

re.escape()函数确保所有正则表达式元字符都被转义,并且我们匹配的文字内容word并且不会意外地将其中的任何内容解释为表达式。

演示:

>>> listword = ['foo', 'bar', 'baz']
>>> sentence = 'The quick fox jumped over the barred door'
>>> if any(re.search(r'\b{}\b'.format(re.escape(word)), sentence) for word in listword):
...     print 'yes'
... 
>>> sentence = 'The tradition to use fake names like foo, bar or baz originated at MIT'
>>> if any(re.search(r'\b{}\b'.format(re.escape(word)), sentence) for word in listword):
...     print 'yes'
... 
yes

通过使用正则表达式,您现在也可以不区分大小写地匹配:

if any(re.search(r'\b{}\b'.format(re.escape(word)), sentence, re.I) for word in listword):
    print 'yes'

在这个演示中themit即使句子中的大小写不同,也符合条件:

>>> listword = ['the', 'mit']
>>> if any(re.search(r'\b{}\b'.format(re.escape(word)), sentence, re.I) for word in listword):
...     print 'yes'
... 
yes
于 2013-04-17T08:13:40.673 回答
1

正如人们指出的那样,您可以使用正则表达式将字符串拆分为列表单词。这称为标记化。

如果正则表达式对你来说不够好,那么我建议看看NTLK——一个 Python 自然语言处理库。它包含多种标记器,它们将根据空格、标点符号和其他可能难以用正则表达式捕获的特征来拆分您的字符串。

例子:

>>> from nltk.tokenize import word_tokenize, wordpunct_tokenize, sent_tokenize
>>> s = '''Good muffins cost $3.88\nin New York.  Please buy me
... two of them.\n\nThanks.'''
>>> wordpunct_tokenize(s)
['Good', 'muffins', 'cost', '$', '3', '.', '88', 'in', 'New', 'York', '.',
'Please', 'buy', 'me', 'two', 'of', 'them', '.', 'Thanks', '.']
>>> "buy" in wordpunct_tokenize(s)
True
于 2013-04-17T08:20:55.430 回答
0

sentence这很简单,如果字符串包含逗号则不起作用,但仍然

if any (" {0} ".format a in sentence for a in listword):
于 2013-04-17T08:27:35.257 回答
0

虽然我特别喜欢分词器和正则表达式解决方案,但我确实认为它们对于这种情况有点矫枉过正,只需使用str.find() 方法就可以非常有效地解决。

listword = ['os', 'slow']
sentence = 'photos'
for word in listword:
    if sentence.find(word) != -1:
       print 'yes'

尽管这可能不是最优雅的解决方案,但(在我看来)它仍然是最适合刚开始使用该语言的人的解决方案。

于 2013-04-17T08:40:39.100 回答
0
>>> sentence="photos"
>>> listword=["os","slow"]
>>> pat = r'|'.join(r'\b{0}\b'.format(re.escape(x)) for x in listword)
>>> bool(re.search(pat, sentence))
False
>>> listword=["os","slow", "photos"]
>>> pat = r'|'.join(r'\b{0}\b'.format(re.escape(x)) for x in listword)
>>> bool(re.search(pat, sentence))
True
于 2013-04-17T08:29:01.257 回答