在关键字列表之间查找文本并在Python中使用RegEx指向

时间:2018-07-25 08:10:25

标签: python regex keyword

# coding=utf-8
import re

m = "Hola esto es un ejemplo Objeto: esta es una de, las palabras."

keywords = ['Objeto:', 'OBJETO', 'Objeto social:', 'Objetos']

obj = re.compile(r'\b(?:{})\b\s*(.*?),'.format('|'.join(map(re.escape, keywords))))
print obj.findall(m)

我想在一个关键词和下一个关键词之间打印文本。在这种情况下,我想要的输出是:“ esta es una de,las palabras。”

2 个答案:

答案 0 :(得分:2)

结尾的\b阻止匹配,因为您的关键字以:结尾

通过删除它来简化正则表达式。再加上贪婪/逗号(.*?),仅提取逗号前的第一部分,我想您的意思是“到下一点”:(.*?)\.

obj = re.compile(r'\b(?:{})\s*(.*?)\.'.format('|'.join(map(re.escape, keywords))))

结果:

['esta es una de, las palabras']

尽管删除单词边界可以匹配句子中部分关键字。之后,您可以用\W 强制使用非单词char,它可以正常工作(作用类似于单词边界):

obj = re.compile(r'\b(?:{})\W\s*(.*?)\.'.format('|'.join(map(re.escape, keywords))))

答案 1 :(得分:1)

Use \b(?:{0})\s*(.*?)(?=\b(?:{0})|$) with lookahead instead:

import re
m = "Hola esto es un ejemplo Objeto: esta es una de, las palabras."
keywords = ['Objeto:', 'OBJETO', 'Objeto social:', 'Objetos']
obj = re.compile(r'\b(?:{0})\s*(.*?)(?=\b(?:{0})|$)'.format('|'.join(map(re.escape, keywords))))
print(obj.findall(m))

This outputs:

['esta es una de, las palabras.']