捕获文本中出现的任何单词;正则表达式;蟒蛇

时间:2016-03-14 16:13:38

标签: python regex

我有一个单词列表,我希望与一堆文本交叉引用,如果文本中出现搜索字符串中的单词,我想保留文本。

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是单词列表。

此方法的准确度非常低,因为它仅保留GoodBadUgly为单独字词的文本。但是,它拒绝用其他词语嵌入它们的情况。

,例如,

GoodwillUgly-ducklingBadBoyGood-Bad-Ugly等实例都被拒绝了,而我肯定需要保留它们。

我认为这可以通过正则表达式解决,但我坦率地说不知道如何。

3 个答案:

答案 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']