我正在python中使用正则表达式查找日期,如09/2010或8/1976,但未找到11/12/2010。我正在使用以下代码行,但在某些情况下无法使用。
r'([^/](0?[1-9]|1[012])/(\d{4}))'
答案 0 :(得分:1)
import re
rgx = "(?:\d{1,2}\/)?\d{1,2}\/\d{2}(?:\d{2})?"
dates = "09/2010, 8/1976, 11/12/2010, 09/06/15 .."
result = re.findall(rgx, dates)
print(result)
# ['09/2010', '8/1976', '11/12/2010', '09/06/15']
答案 1 :(得分:1)
以下是一些明确的代码,它使用re.sub
和datetime.strptime
来解析/验证输入字符串:
import re
import datetime
s = '09/2010, 8/1976, 11/8/2010, 09/06/15, 12/1987, 13/2011, 09/13/2001'
r = re.compile(r'\b(\d{1,2})/(?:(\d{1,2})/)?(\d{2,4})\b')
def validate_date(g, parsed_values):
if not g.group(2) is None:
s = '{:02d}/{:02d}/{:04d}'.format(*map(int, g.groups()))
else:
s = '01/{:02d}/{:04d}'.format(int(g.group(1)), int(g.group(3)))
try:
datetime.datetime.strptime(s, '%d/%m/%Y')
parsed_values.append(g.group())
return
except:
pass
parsed_values = []
r.sub(lambda g: validate_date(g, parsed_values), s)
print(parsed_values)
打印:
['09/2010', '8/1976', '11/8/2010', '09/06/15', '12/1987']
编辑:缩短了代码。
答案 2 :(得分:0)
解决了这个问题之后,我来到了这个解决方案:
这很好用!
df['text'].str.extractall(r'(?P<Date>(?P<month>\d{1,2})/?(?P<day>\d{1,2})?/(?P<year>\d{2,4}))')