2014-03-01 182 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