如何在python中的re.search中输入变量字符串

时间:2018-08-13 18:53:12

标签: python regex python-3.x

最初,我的日期正则表达式的工作方式如下,例如捕获“ 2018年2月12日”

match = re.search(r'(January|February|March|April|May|June|July|August|September?|October?|November|December)\s+\d{1,2},\s+\d{4}', date).group()

但是我希望它变得更加灵活,并将变量字符串输入到我的正则表达式中,但是在浏览了许多关于类似问题的stackoverflow线程后,我似乎无法使其工作。我是个新手,所以我不知道出了什么问题。我知道MONTHS根本行不通。谢谢

MONTHS = "January|February|March|April|May|June|July|August|September|October|November|December"

match = re.search(r'(MONTHS)\s+\d{1,2},\s+\d{4}', date).group()

print(match)
'NoneType' object has no attribute 'group'

2 个答案:

答案 0 :(得分:1)

您已经将MONTHS作为匹配字符串的一部分,python不知道它应该引用存储另一个字符串的变量。

因此,请尝试:

match = re.search(r'(' + MONTHS + ')\s+\d{1,2},\s+\d{4}', date).group()

这将连接(粘在一起)三个字符串,第一个字符串,然后是存储在MONTHS变量中的字符串,然后是最后一个字符串。

答案 1 :(得分:0)

如果要将某些内容替换为字符串,则需要使用格式字符串(无论是f字符串文字还是字符串对象上的formatformat_map方法)或printf样式格式(或模板字符串,或第三方库…,但通常是前两个库之一)。

通常,格式字符串是最简单的解决方案,但对于需要用括号括起来的字符串来说,它们不能很好地发挥作用。您不希望将{4}视为“填写第四个参数”,而将其转义为{{4}}会使可读性降低(并且在处理正则表达式时,它们会已经不够可读...)。

因此,在这里printf样式格式可能是一个更好的选择:

pattern = r'(%s)\s+\d{1,2},\s+\d{4}' % (MONTHS,)

…或:

pattern = r'(%(MONTHS)s)\s+\d{1,2},\s+\d{4}' % {'MONTHS': MONTHS}