我需要从lst列表中检测文本中的确切模式,但不是当它是其他单词的一部分时。我知道我可以使用锚点来精确匹配模式,但它不适用于变量。非常感谢您的帮助!
lst = ['Test', 'Pink', 'Blue', 'Green']
text = 'Testing and Pink. Blue is my fav color. Greenwood is my name.'
def get_words_from_lst(text, lst):
words = []
for word in lst:
if r'{}'.format(word) in text:
words.append(word)
print(words)
get_words_from_lst(text, lst)
所需的输出:['Pink', 'Blue']
答案 0 :(得分:3)
将正则表达式与boundaries (\b)
<强>演示:强>
import re
lst = ['Test', 'Pink', 'Blue', 'Green']
text = 'Testing and Pink. Blue is my fav color. Greenwood is my name.'
def get_words_from_lst(text, lst):
#print([word for word in lst if re.search(r"\b"+word+r"\b", text)]) #Single line list comprehension
words = []
for word in lst:
if re.search(r"\b"+word+r"\b", text):
words.append(word)
print(words)
get_words_from_lst(text, lst)
<强>输出:强>
['Pink', 'Blue']
答案 1 :(得分:0)
您可以使用正则表达式从标点符号中拆分字母组(单词),然后使用列表解析:
>>> [word for word in re.split(r'[^a-zA-Z]',text) if word in lst]
['Pink', 'Blue']
或者,或者:
>>> [word for word in re.split(r'\W',text) if word in lst]
['Pink', 'Blue']
在任何一种情况下,如果您使用re.split
,对unicode的支持都会受到限制。 Python re
模块不支持允许在任何非字母unicode字符上进行拆分的[^\p{L}]
。
您也可以将其作为过滤器进行处理并执行:
>>> [word for word in lst if re.search(r'\b{}\b'.format(word), text)]
['Pink', 'Blue']
或
>>> filter(lambda w: re.search(r'\b{}\b'.format(w), text), lst)
['Pink', 'Blue']
但如果只有ascii文本,第一种方法会更快。第二种方法支持带有正确标志的unicode。
答案 2 :(得分:0)
按非字字符\W
拆分文字。然后找到两个列表的交集。
set(lst).intersection(re.split('\W', text))
答案 3 :(得分:0)
您可以使用str.join
:
import re
lst = ['Test', 'Pink', 'Blue', 'Green']
text = 'Testing and Pink. Blue is my fav color. Greenwood is my name.'
new_text = re.findall('|'.join(r'\b{}\b'.format(i) for i in lst), text)
输出:
['Pink', 'Blue']