我有一个单词列表,我希望与一堆文本交叉引用,如果文本中出现搜索字符串中的单词,我想保留文本。
search_string = ['Good', 'Bad', 'Ugly']
到目前为止我的代码是:
retained_texts = []
for text in full_text:
if set(text) & search_string:
retained_texts.append(' '.join(text))
此处,full_text
是列表列表,text
是单词列表。
此方法的准确度非常低,因为它仅保留Good
,Bad
和Ugly
为单独字词的文本。但是,它拒绝用其他词语嵌入它们的情况。
,例如,
Goodwill
,Ugly-duckling
,BadBoy
,Good-Bad-Ugly
等实例都被拒绝了,而我肯定需要保留它们。
我认为这可以通过正则表达式解决,但我坦率地说不知道如何。
答案 0 :(得分:2)
您可以使用以下正则表达式执行此操作:
re.match('(Good|Bad|Ugly)', text)
所以你的完整代码看起来像这样:
import re
search_string = ['Good', 'Bad', 'Ugly']
pattern = '({0})'.format('|'.join(map(re.escape, search_string)))
retained_texts = []
for text in full_text:
if re.search(pattern, text):
retained_texts.append(' '.join(text))
更新:正如评论所指出的,如果search_string
包含点,括号或需要在正则表达式中转义的任何其他字符,则会出现问题。这可以通过在构建模式时调用re.escape
来修复,我已相应地编辑了上面的示例。
答案 1 :(得分:1)
你也可以这样做:
search_list = ['Good', 'Bad', 'Ugly']
retained_texts = []
for text in full_text:
if any(search in word for word in text for search in search_list):
retained_texts.append(' '.join(text))
答案 2 :(得分:1)
你可以先将full_text弄平,然后进行正则表达式匹配:
>>> import re
>>> search_string = ['Good', 'Bad', 'Ugly']
>>> full_text = [['yes','no'],['Bad','Ahh'],['Goodwill','Ugly-duckling','BadBoy','Good-Bad-Ugly']]
>>> [j for j in [i for f in full_text for i in f] if re.findall('Good|Bad|Ugly',j)]
['Bad', 'Goodwill', 'Ugly-duckling', 'BadBoy', 'Good-Bad-Ugly']