Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式匹配日期_Python_Regex_Date_Elementtree - Fatal编程技术网

Python正则表达式匹配日期

Python正则表达式匹配日期,python,regex,date,elementtree,Python,Regex,Date,Elementtree,我正在抓取并保存(以逗号分隔的文本文件)美国众议院唱名表决的信息 结果文件中的每一行采用以下形式: 唱名编号、法案、日期、代表、投票、赞成票总数、反对票总数 我遇到的麻烦是把日期从2001年11月1日(点名414)推迟到现在。正则表达式没有匹配2001年11月1日,而是匹配错误或中断。在第一种情况下,它匹配字符串“-和-”。文本确实在#414和#415之间更改,以包含字符串“yes-and-NAYS” 我打赌我把正则表达式写错了,但我看不出来。我可能需要更改什么来匹配日期?相关代码如下 impo

我正在抓取并保存(以逗号分隔的文本文件)美国众议院唱名表决的信息

结果文件中的每一行采用以下形式:

唱名编号、法案、日期、代表、投票、赞成票总数、反对票总数

我遇到的麻烦是把日期从2001年11月1日(点名414)推迟到现在。正则表达式没有匹配2001年11月1日,而是匹配错误或中断。在第一种情况下,它匹配字符串“-和-”。文本确实在#414和#415之间更改,以包含字符串“yes-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
导入urllib2、日期时间、系统、re、字符串 将xml.etree.ElementTree作为ET导入 对于范围内的i(414514): 如果i<10: num_string=“00”+str(i) 如果i<100: num_string=“0”+str(i) 如果i>100: num_string=str(i) 打印num_字符串,datetime.datetime.now() url=”http://clerk.house.gov/evs/2001/roll“+num_字符串+”.xml” text=urlib2.urlopen(url.read()) tree=ET.fromstring(文本) notags=ET.tostring(树,encoding=“utf8”,method=“text”) dte=re.search(r'[0-9]*-[A-Za-z]*-[0-9]*',notags.group() 打印dte
对XML文档使用正则表达式从来都不是一个好主意(说真的)

通过从相关的XML元素中提取日期(我使用了
lxml.etree
而不是
XML.etree.ElementTree
,但原理是一样的),您可以在不使用任何正则表达式的情况下获得所需的结果

此外,我还添加了一种更简单的方法来生成一个3位数的数字(如有必要,则前导0)


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

使用
datetime
模块解析日期要容易得多。您可以使用比regex更清晰的界面指定自定义格式。这只是一个简单的问题:由于数字是必需的,您可能至少需要
r'[0-9]+-[a-Za-z]*-[0-9]+'
,因此这些模式元素不能匹配空字符串。由于年份总是(?)包含四位数字,您甚至可以使用
r'[0-9]*-[A-Za-z]*-[0-9]{4}'
。您正在使用与日期匹配的正则表达式解析整个XML文档-坏主意(tm)。首先提取相关元素,然后用正则表达式解析它。提示:找到
元素并解析其中的文本。还有一点-如果没有匹配项,则
re.search()
将返回
None
,它没有
.groups()
方法,因此您的代码将出现AttributeError异常。这非常有效。我觉得自己很傻;我甚至没有考虑利用现有的结构。
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