正则表达式与变量的精确模式匹配

时间:2018-05-25 17:42:06

标签: python regex python-3.x

我需要从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']

4 个答案:

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