Python正则表达式匹配日期

时间:2014-03-01 22:19:10

标签: python regex date elementtree

我正在抓住并保存(作为逗号分隔的文本文件)有关美国众议院唱名表决的信息。

生成的文件中的每一行都采用以下形式:

滚动电话号码,账单,日期,代表,投票,总计,总计当天

我遇到麻烦的时候是从2001年11月1日(唱名电话414)开始刮取日期。正则表达式匹配错误或中断,而不是匹配2001年11月1日。在第一种情况下,它匹配字符串'-AND-'。文本确实在#414和#415之间改变以包括字符串'YEAS-AND-NAYS'。

我打赌我写的正则表达式错了,但我没有看到它。我可能需要更改哪些内容才能匹配日期?相关代码如下。

import urllib2, datetime, sys, re, string
import xml.etree.ElementTree as ET

for i in range(414,514):
    if i < 10:
        num_string = "00"+str(i)
    elif i < 100:
        num_string = "0"+str(i)
    elif i > 100:
        num_string = str(i)
    print num_string, datetime.datetime.now()
    url = "http://clerk.house.gov/evs/2001/roll"+num_string+".xml"
    text = urllib2.urlopen(url).read()
    tree = ET.fromstring(text)
    notags = ET.tostring(tree, encoding="utf8", method="text")
    dte = re.search(r'[0-9]*-[A-Za-z]*-[0-9]*', notags).group()
    print dte

1 个答案:

答案 0 :(得分:0)

对XML文档使用正则表达式(严肃地说)绝不是一个好主意。

通过从相关XML元素中提取日期(我使用lxml.etree而不是xml.etree.ElementTree,您可以在没有任何正则表达式的情况下实现所需的结果,但原理将是相同的。)< / p>

另外,我添加了一种更简单的方法来生成一个3位数字(必要时前导0)。

import urllib2, datetime, sys, string
import lxml.etree

for i in range(414,416):
    num_string = '{:03d}'.format(i)
    print num_string, datetime.datetime.now()
    url = "http://clerk.house.gov/evs/2001/roll"+num_string+".xml"
    xml = lxml.etree.parse(urllib2.urlopen(url))
    root = xml.getroot()
    actdate = root.xpath('//action-date')[0]
    dte = actdate.text.strip()
    print dte

如果你坚持使用正则表达式,那么[0-9]+-[A-Za-z]+-[0-9]+会更好,因为它保证至少有一个数字后跟破折号,后跟至少一个字母后跟破折号,后跟至少一个数字(如holdenweb提到的那样)在他的评论中)。