我有一个字符串,可以包含以下内容:
lots of text Nov 30 2011 lots more of text
或
lots of text Nov 30 12:48 lots more of text
我想要匹配的是该行内的日期。我想得到的是第一行的以下内容:
{'date': 'Nov 30 2011', 'time': None}
或第二行:
{'date': None, 'time': 'Nov 30 12:48'}
所以我的尝试是这样的:
re.match(
'^.+((?P<date>\w{3} \d{1,2} \d{4})|(?P<time>\w{3} \d{1,2}:\d{2})).+',
line
)
但是这不起作用,它会返回None
。我尝试了其他一些组合,但都没有效果。
我该怎么做?
答案 0 :(得分:2)
您错过<time>
群组的一天(例如“11月12:48”):
(?P<date>\w{3} \d{1,2} \d{4})|(?P<time>\w{3} \d{1,2} \d{1,2}:\d{2})
此外,您可以在没有^.+(...).+
的情况下匹配该模式 - 除了在日期之前和之后至少要求字符时,它不会增加太多。
我还建议您使用\s+
或+
(空格+或[ ]+
替换空格,如果您希望它可见) - 您在某些地方有双倍空格,这不太强大
另一个选择是避免重复 - 将日期保留在自己的组中,并在时间和年份之间添加替代项:
(?P<date>\w{3}\s+\d{1,2})\s+(?:(?P<year>\d{4})|(?P<time>\d{1,2}:\d{2}))
工作示例: http://rubular.com/r/g81Kudu0dY (没有名字)