什么是匹配字符串中单词的有效方法(Python)?

2024-05-03 15:50:24 发布

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

示例:

1. names = ['James John', 'Robert David', 'Paul' ... the list has 5K items]
2. 
3. text1 = 'I saw James today'
4. text2 = 'I saw James John today'
5. text3 = 'I met Paul'
6. 
7. is_name_in_text(text1,names)   # this returns false 'James' in not in list
8. is_name_in_text(text2,names)   # this returns 'James John'
9. is_name_in_text(text3,names)   # this return 'Paul'

is_name_in_text()搜索是否有任何名称列表为文本。

简单的方法是使用“in”运算符检查名称是否在列表中,但是该列表有5000个项,因此效率不高。我可以将文本拆分成单词,并检查单词是否是列表中的in,但如果有多个单词匹配,则这不起作用。在这种情况下,第7行将失败。


Tags: textnamein列表todaynamesisthis
3条回答

names变成一个set,并使用in运算符快速查找O(1)。

您可以使用regex解析句子中可能的名称:

>>> import re
>>> findnames = re.compile(r'([A-Z]\w*(?:\s[A-Z]\w*)?)')
>>> def is_name_in_text(text, names):
        for possible_name in set(findnames.findall(text)):
            if possible_name in names:
                return possible_name
        return False

>>> names = set(['James John', 'Robert David', 'Paul'])
>>> is_name_in_text('I saw James today', names)
False
>>> is_name_in_text('I saw James John today', names)
'James John'
>>> is_name_in_text('I met Paul', names)
'Paul'

使用所有替代项构建正则表达式。这样你就不必担心事先把词组中的名字取出来了。

import re
names_re = re.compile(r'\b' +
                      r'\b|\b'.join(re.escape(name) for name in names) +
                      r'\b')

print names_re.search('I saw James today')

您可以使用Python的set,以便在使用in运算符时获得良好的性能。

相关问题 更多 >