如何使列表的元素成为正则表达式的一部分?

时间:2017-11-09 10:19:05

标签: python regex python-3.x

所以我有一个字符串列表,让我们说:my_list = ['hope', 'faith', 'help']

现在我打开一个名为infile的文本文件,然后用单词分隔 for line in infile: line_list = line.split() 现在我想制作一个正则表达式,我可以通过使用for循环来改变:

for word in line_list:
     match = re.findall(word$, line_list)
     print(match)

我已经尝试了几种方法来获得“#”字样'进入那个正则表达式,但似乎没有工作 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您不需要使用正则表达式。 Python中的标准类型endswithstr方法。

with open('path/name.ext') as infile :
    line_list = infile.readlines()

for line in line_list :
    match = [word for word in my_list if line.endswith(word)]
    print(match)

这将打印出匹配的单词或文件中每一行的空列表。

但如果你绝对想要......你可以使用正则表达式来实现...

pattern = r'({0})$'.format('|'.join(my_list))

for line in line_list :
    match = re.findall(pattern, line)
    print(match)

搜索模式包含一个组,其中my_list的所有元素都使用逻辑or |进行操作。

答案 1 :(得分:1)

正则表达式只是一个字符串,可能包含也可能不包含通配符或特殊字符。因此,“将列表元素作为正则表达式的一部分”的最佳方法是“编写”正则表达式:

my_list = ['hope', 'faith', 'help']
for regex_el in my_list:
    regex = "{0:s}".format(regex_el)
    print regex

当然,这过于简单化。那只是使用普通字符串作为正则表达式。您可以使用小的正则表达式来插入较大的正则表达式,或者您可以使用正则表达式的其他部分将列表中的元素包围:

regex = "^ *{0:s} ".format(regex_el)

构造一个正则表达式,只有当它是一个字符串中的第一个单词,前面没有空格或后面跟一个空格时才能找到你的单词。

然后在你的代码中,将你的调用中的'word'替换为上面构造的'regex'。

您需要将调用中的line_list替换为findall以及findall预期模式(简单字符串或真正的正则表达式)和要搜索的字符串(可能是{{ 1}}在你的循环中或word从循环遍历文件中的行。

另请注意,如果未找到匹配项,line将打印一个空列表。您可能希望用

替换它
print match

仅打印与您构造的正则表达式匹配的行中的单词。

我可以建议您查看这个网站:https://regex101.com/来试验正则表达式以及您正在使用的字符串。