2014-03-01 130 views
0

我在美国众议院刮印和保存(作为逗号分隔的文本文件)有关唱名表决的信息。Python正则表达式匹配日期

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

点名号码,比尔,日期,代表投票,总赞成票,总该院

在那里我遇到了麻烦刮日期从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 
+0

使用'datetime'模块解析日期更容易。您可以指定一个比正则表达式更清晰的自定义格式 – slezica

+0

只是一个快速点:因为数字是必需的,所以您可能至少需要'r'[0-9] + - [A-Za-z] * - [0 -9] +''所以这些模式元素不能匹配空字符串。由于年份始终(?)包含四位数字,您甚至可以使用'r'[0-9] * - [A-Za-z] * - [0-9] {4}''。 – holdenweb

+0

您正在使用与日期匹配的正则表达式解析整个XML文档 - BAD IDEA(tm)。首先提取相关的元素,然后用正则表达式解析。提示:找到''元素并解析其中的文本。 – isedev

回答

0

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

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

此外,我添加了一个更简单的方法来生成一个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提到在他的评论中)。

+0

这工作很好。我感到很傻,我甚至没有考虑利用现有的结构。 – mpritche