2

我需要以以下格式提取日期:dd Month yyyy(2013 年 8 月 20 日)。我尝试了以下正则表达式:

\d{2} (January|February|March|April|May|June|July|August|September|October|November|December) \d{4}

它适用于正则表达式测试器(检查了几个文本 - 2013 年 8 月 19 日星期一),但 Python 似乎不理解它。我得到的输出是:

>>> 
['August']
>>> 

有人可以理解我为什么会这样吗?

谢谢 !

4

2 回答 2

3

你用了re.findall吗?默认情况下,如果模式中至少有一个捕获组,re.findall则将仅返回表达式的捕获部分。

您可以通过删除每个捕获组来避免这种情况,从而导致re.findall返回整个匹配:

\d{2} (?:January|February|...|December) \d{4}

或通过制作一个大型捕获组:

(\d{2} (?:January|February|...|December) \d{4})

或者,可能更方便的是,将每个组件都设为捕获组:

(\d{2}) (January|February|...|December) (\d{4})

如果您需要处理单独的日/月/年组件,后一种形式会更有用。

于 2013-08-20T03:09:45.390 回答
2

看起来你只是从捕获组中获取数据,试试这个:

(\d{2} (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{4})

我在整个事情上设置了一个捕获组,并使该月成为一个非捕获组。现在任何给你“八月”的东西都应该给你整个东西。


我只是在这里查看了一些 python 正则表达式的东西

>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'

看到这个,我猜(因为你没有展示你是如何实际使用这个正则表达式的)你正在做group(1)的现在将与我上面提供的正则表达式一起工作。

看起来你也可以用来group(0)得到整个事情(如果我假设这是你正在做的事情是正确的)。这将适用于您的原始正则表达式以及我的修改版本。

于 2013-08-19T21:11:49.103 回答