4

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

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

我怎样才能做到这一点?

4

1 回答 1

2

您错过了<time>小组中的那一天(例如“Nov 12:48”):

(?P<date>\w{3} \d{1,2}  \d{4})|(?P<time>\w{3} \d{1,2} \d{1,2}:\d{2})

此外,您可能可以匹配该模式而无需^.+(...).+- 它除了要求至少在您的日期之前和之后的字符之外并没有增加太多。我还建议用\s+or替换空格+(空格加号,或者[ ]+如果您希望它可见)-在某些地方有双空格,这不太健壮。

另一种选择是避免重复 - 将日期保留在自己的组中,并在时间和年份之间添加交替:

(?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 (无名称)

于 2012-08-15T06:17:26.920 回答