Python正则表达式:匹配一个命名组或另一个

时间:2012-08-15 06:09:44

标签: python regex

我有一个字符串,可以包含以下内容:

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。我尝试了其他一些组合,但都没有效果。

我该怎么做?

1 个答案:

答案 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 (没有名字)