我有一个脚本可以读取电子邮件并从正文中提取日期时间。这是正常工作,直到它收到一封日期时间格式的电子邮件,如下所示:
06:00 Wednesday 22ndFebruary 2017
在22日和2月之间没有空间,因此当函数运行以将时间排除在体外时我得到了错误
Traceback (most recent call last):
File "email_processing.py", line 137, in <module>
e_start_time, e_end_time = main_dt(content)
File "email_processing.py", line 26, in main_dt
date = dateutil.parser.parse(re.search(pattern, data).group(0))
File "/usr/lib/python2.7/site-packages/dateutil/parser.py", line 1168, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/usr/lib/python2.7/site-packages/dateutil/parser.py", line 559, in parse
raise ValueError("Unknown string format")
ValueError: Unknown string format
我目前的功能如下,任何人都可以想到验证它的方法/确保有空间需要吗?鉴于字符串中的任何地方都可能存在空格问题,并且随着更多电子邮件的进入,日期会明显改变?
由于
def main_dt(data):
dates = []
for pattern in ['(?<=Start Time & Date: ).*', '(?<=Completion Time & Date: ).*']:
try:
date = dateutil.parser.parse(re.search(pattern, data).group(0))
except:
print re.search(pattern, data).group(0)
dates.append(date)
return dates
样本体:
Dear Customer,
(Call Transferred) We are writing to inform you of planned engineering work taking place which could impact your service.
The affected site is : XXXXXX
Maintenance window:
Start Time & Date: 01:00 Wednesday 22nd February 2017
Completion Time & Date: 06:00 Wednesday 22ndFebruary 2017
Details of Work:
...
答案 0 :(得分:1)
这更多是正则表达式问题。
您要捕获异常的部分,请确保使用以下方法重新格式化不正确的数据:
validation_pattern = '(.*\\d+[a-z]{2})([A-Z].*)'
try:
date = dateutil.parser.parse(re.search(pattern, data).group(0))
except:
dirty_data_group = re.search(pattern, data).group(0)
tidy_data_group = re.sub(validation_pattern, r'\1 \2', dirty_data_group)
date = dateutil.parser.parse(tidy_data_group)
这应该每次在数组中得到正确的日期。但是,这仅限于您所指的具体问题,即月份与月份之间没有空格。