Regex 在python中使用列表作为正则表达式的参数

Regex 在python中使用列表作为正则表达式的参数,regex,python-2.7,Regex,Python 2.7,我正在构建正则表达式来查找文本中的日期。我已经为作为日期一部分的月份名称、日期和特殊字符创建了列表 dict_month_name =['january','february','march','april','may','june','july','august','september','october','november','december'] dict_day =['Monday','Tuesday','Wednesday','Thursday','Friday','Saturda

我正在构建正则表达式来查找文本中的日期。我已经为作为日期一部分的月份名称、日期和特殊字符创建了列表

dict_month_name =['january','february','march','april','may','june','july','august','september','october','november','december']

dict_day =['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

dict_special_char = ['-', '/', '.', ',' ,'',' ']
我还编译了它们,如下所示

month_name = re.compile('|'.join(dict_month_name))

day = re.compile('|'.join(dict_day))

special_char = re.compile('|'.join(dict_special_char))
现在,在下面所示的正则表达式中,我想使用前面创建的列表的不同变体。例如,要搜索日期,如2017年1月1日星期一,正则表达式将为-

regexp1 = re.findall('.*?^(day+,\s,month_name+\s[0-9][0-9][0-9][0-9])$.*', text)

但是,正则表达式没有返回任何输出。我需要使用regex而不是datetime模块来解决这个问题。是否有一种方法可以将我的列表包含在正则表达式中,如上图所示?

您可以通过以下方式组合正则表达式:

import re
dict_month_name =['january','february','march','april','may','june','july','august','september','october','november','december']
dict_day =['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
dict_special_char = ['-', '/', '.', ',' ,'',' ']

s = 'For e.g. to search for dates like - Monday, January 2017 the regex would be'
rx = r"\b(?:{day})[{special}]\s+(?:{month_name})\s+[0-9]{{4}}\b".format(
    day="|".join(dict_day), 
    special="".join([re.escape(x) for x in dict_special_char]), 
    month_name="|".join(dict_month_name))

print(re.findall(rx, s, re.I)) # => ['Monday, January 2017']

在本例中,正则表达式是

\b(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)[\-\/\.\,\ ]\s+(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+[0-9]{4}\b
您可以看到,这些模式现在是更大模式的一部分
re.I
启用不区分大小写的匹配


还要注意的是,特殊字符应使用
[re.escape(x)for x in dict_special_char]
进行转义,以便作为文字字符进行匹配。

regexp1
未使用任何预编译的正则表达式,在
text
中搜索
'day'
'month\u name'
。我认为没有办法直接组合已编译的正则表达式。我能找到的最接近的是。@DeepSpace有没有办法告诉re.findall函数将“日”和“月”作为列表而不是文本来搜索您提到的模式?@user8929822我检查了您的问题历史记录,发现您没有接受任何答案。请考虑通过点击<代码>接受为您工作的答案。✓位于左侧(请参阅)。注意:接受答案可获得2分。此外,也请考虑对你有用的答案进行投票(参见)。谢谢你的建议。我已经复习了我的问题并接受了适当的答案。谢谢。这似乎奏效了。还有一件事。我的日期数据有很多变化。我是否需要为每个唯一的格式编写正则表达式,或者是否有更有效的方法使用正则表达式字典方法来解决此问题?@user8929822我认为您需要使用它们各自的模式来处理它们,但您可以使用
为单个正则表达式添加替代方法。