我想从字符串中解析出所有日期(可能以不同的形式写入)。问题是可能有一个日期写在这种形式d/m -y
例如22/11 -12。但是也可能有一个日期用这种形式d/m
写成,没有指定年份。如果我在这个包含更长形式的字符串中找到日期,我不希望它以更短的形式再次找到。这是我的代码失败的地方,它找到了第一个日期两次(一年与一年,一次没有它)。确保两个正则表达式找不到相同的结果
我真的有两个问题:(1)做这件事的“正确”方法是什么?看来我真的从错误的角度来解决这个问题。 (2)如果我应该坚持这样做的话,那么这条线datestring.replace(match.group(0), '')
怎么会不删除日期以至于我再也找不到了?
这是我的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
dformats = (
'(?P<day>\d{1,2})/(?P<month>\d{1,2}) -(?P<year>\d{2})',
'(?P<day>\d{1,2})/(?P<month>\d{1,2})',
'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})',
)
def get_dates(datestring):
"""Try to extract all dates from certain strings.
Arguments:
- `datestring`: A string containing dates.
"""
global dformats
found_dates = []
for regex in dformats:
matches = re.finditer(regex, datestring)
for match in matches:
# Is supposed to make sure the same date is not found twice
datestring.replace(match.group(0), '')
found_dates.append(match)
return found_dates
if __name__ == '__main__':
dates = get_dates('1/2 -13, 5/3 & 2012-11-22')
for date in dates:
print date.groups()
很好的回答,恭喜! – georg
Emacs抱怨你不遵循pep-8 ;-)否则一个很好的答案。尽管在正则表达式中使用'|'这不是处理相同名称组的简单方法,但我困扰了我。有6行处理这个问题(!): -/ –
Niclas:是的,我编辑了它大约3次,可能仍然没有正确的答案:)另外,是的,我很沮丧,RE引擎didn'让我重新使用这些名称,我可以创建一个简单的函数来重新映射以清理代码。如果我们可以假设我们总是将PERIOD-X拷贝到PERIOD,如果dayX存在,X在范围内(1,4),PERIOD在['day','month','year'],那么这只是一个几行。任何更复杂的处理可能都必须像上面那样分解它。 –