函数re.findall 执行以下操作:
返回字符串中所有不重叠的模式匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开头。
因此,如果有组,它会返回组。 group 是括号中的正则表达式中的任何内容。
解决方案 1
要单独获取每个项目,请将所有内容放入 parentesis:
reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
"(January|February|March|April|May|June|July|August|September|October|November|December)"\
" (\d{1,2}), (\d{4}) (\d{2}):(\d{2}) (AM|PM)"
然后re.findall(reg_datetime, senton)会返回:
[('Friday', 'June', '18', '2010', '12', '57', 'PM')]
解决方案 2
或者,将所有内容放在一个大组中:
reg_datetime = "((Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
"(January|February|March|April|May|June|July|August|September|October|November|December)"\
" \d{1,2}, \d{4} \d{2}:\d{2} (AM|PM))"
现在大组也返回了:
[('Friday, June 18, 2010 12:57 PM', 'Friday', 'June', 'PM')]
解决方案 3
或者将现有的 grop 更改为非捕获组(语法 (?:...))
reg_datetime = "(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
"(?:January|February|March|April|May|June|July|August|September|October|November|December)"\
" \d{1,2}, \d{4} \d{2}:\d{2} (?:AM|PM)"
结果:
['Friday, June 18, 2010 12:57 PM']
解决方案 4
或者根本不使用findall。使用re.search。它返回一个Match 对象,为您提供更多选择。原来的reg_datetime 是这样工作的:
>>> m = re.search(reg_datetime, senton)
>>> m.group(0)
'Friday, June 18, 2010 12:57 PM'
>>> m.group(1)
'Friday'
>>> m.group(2)
'June'
>>> m.group(3)
'PM'