python正则表达式findall,需要删除不精确的匹配

时间:2012-05-07 15:22:45

标签: python regex

尝试编写RE以识别Python中的日期格式mm / dd

reg = "(((1[0-2])|(0?[1-9]))/((1[0-9])|(2[0-9])|(3[0-1])|(0?[0-9])))"
match = re.findall(reg, text, re.IGNORECASE)
print match

对于text ='4/13',它给了我 [('4/13', '4', '', '4', '13', '13', '', '', '')]

只需要第一个元素。我不想要不精确的比赛,我该如何删除它们。

谢谢,

2 个答案:

答案 0 :(得分:1)

您正在获取所有这些匹配项,因为正则表达式中的每组括号都会生成一个匹配组。如果您真的不希望结果集中的组,则可以使用非分组匹配,例如(?:...)。您也可以简单地从列表中取出第一个项目而忽略其他项目。

这会使你的表达式看起来像:

reg = "((?:(?:1[0-2])|(?:0?[1-9]))/(?:(?:1[0-9])|(?:2[0-9])|(?:3[0-1])|(?:0?[0-9])))"

有关详细信息,请参阅re文档。

这是一个完整的例子:

>>> text='4/13'
>>> reg = "((?:(?:1[0-2])|(?:0?[1-9]))/(?:(?:1[0-9])|(?:2[0-9])|(?:3[0-1])|(?:0?[0-9])))"
>>> re.findall(reg, text, re.IGNORECASE)
['4/13']

答案 1 :(得分:0)

他们不是“不精确的比赛”。元组中的第一项对应于匹配的字符串,其他项对应于正则表达式中括号中的部分。

如果字符串中有多个日期,您需要这样:

reg = re.compile(...)
dates = [match[0] for match in reg.findall(text, re.IGNORE_CASE)]