1

所以基本上我试图从一个目录中的多个文件中读取行并使用正则表达式来专门找到一种时间戳的开头,我还想在正则表达式中放置一个月份列表的实例,然后创建一个计数器每个月根据它出现的次数。我在下面有一些代码,但它仍在进行中。我知道我关闭了 date_parse,但这就是我要问的原因。如果您能想到更有效的方法,请留下另一个建议。谢谢。

months = ['Jan','Feb','Mar','Apr','May','Jun',\
          'Jul','Aug','Sep','Oct','Nov','  Dec']
date_parse = re.compile('[Date:\s]+[[A-Za-z]{3},]+[[0-9]{1,2}\s]')
counter=0
for line in sys.stdin:
    if data_parse.match(line):
        for month in months in line:
            print '%s %d' % (month, counter)
4

1 回答 1

2

在正则表达式中,您可以有一个替代模式列表,使用竖线分隔。

http://docs.python.org/library/re.html

from collections import defaultdict

date_parse = re.compile(r'Date:\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)')

c = defaultdict(int)

for line in sys.stdin:
    m = date_parse.match(line)
    if m is None:
        # pattern did not match
        # could handle error or log it here if desired
        continue # skip to handling next input line
    month = m.group(1)
    c[month] += 1

一些注意事项:

  • 我建议您使用原始字符串(带有r''r"")作为模式,这样反斜杠就不会变成字符串转义符。例如,在普通字符串中,\s不是转义符,您将得到一个反斜杠后跟一个“s”,但\n它是一个转义符,您将得到一个字符(换行符)。

  • 在正则表达式中,当您将一系列字符括在方括号中时,您会得到一个匹配任何字符的“字符类”。因此,当您输入时,[Date:\s]+您会匹配Date:,但您也会匹配taD:e或这些字符的任何其他组合。只输入一个应该匹配自身的字符串是完全可以的,比如Date:.

于 2012-04-12T05:55:53.067 回答