Python 为什么我的正则表达式不能正确返回组(0)?

Python 为什么我的正则表达式不能正确返回组(0)?,python,regex,Python,Regex,我想从大量文件中查找日期。日期在单行上,格式为“2010年9月21日”。每个文件中只有一个这样的日期 以下代码仅返回月份,例如,“九月”。为什么组(0)不给我像“2010年9月21日”? 这里少了什么?谢谢大家! months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") pattern =

我想从大量文件中查找日期。日期在单行上,格式为
“2010年9月21日”
。每个文件中只有一个这样的日期

以下代码仅返回月份,例如,
“九月”
。为什么组(0)不给我像
“2010年9月21日”
? 这里少了什么?谢谢大家!

months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

pattern = r"^\d{2} +" + "|".join(months) + r" +\d{4}$"
match = re.search(pattern, text)
if match:
    fdate = match.group(0)

当你打印正则表达式时,你会看到它看起来像
^\d{2}+一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月{d{4}$
。当您将其应用于2010年9月21日的
21
时,您将看到它,因为
^\d{2}+
只能与字符串开头的
一月
匹配,因为月份替代项未分组

您需要将月份备选方案分组:

pattern = r"^\d{{2}} +(?:{}) +\d{{4}}$".format("|".join(months))
见:


请尝试
pattern=r“^\d{{2}+(?:{})+\d{{4}}$”.format(“|”。.join(months))
。如果它在一行上,并且您读取了整个文件,那么添加
re.M
标志。您可以通过执行类似
r“\d{2}[JFMASOND][a-z]+\d{4}”
的操作来简化您的正则表达式。这样,您就不必处理连接或
|
运算符。@brittenb但这非常脆弱,因为它可以匹配非日期的字符串(即使风险可能很小)。@JohanL这是真的,OP必须确定的一个问题可能是给定了数据集。这只是我尝试的第一种方法,如果我在结果中看到任何误报,我会继续使用更严格的正则表达式。
import re
text = "21 September 2010"
months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
pattern = r"^\d{{2}} +(?:{}) +\d{{4}}$".format("|".join(months))
match = re.search(pattern, text)
if match:
    fdate = match.group(0)
    print(fdate) # => 21 September 2010