Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 - Fatal编程技术网

Python中的正则表达式月份和年份搜索

Python中的正则表达式月份和年份搜索,python,Python,这是我的问题。我有一个包含32篇文章的复杂文本文件。由于每篇文章都以32个文档中的1个、32个文档中的2个等开头,因此我使用以下代码将文本拆分为不同的文章: import re sections = [] current = [] with open("Aberdeen2005.txt") as f: for line in f: if re.search(r"(?i)\d+ of \d+ DOCUMENTS", line): s

这是我的问题。我有一个包含32篇文章的复杂文本文件。由于每篇文章都以32个文档中的1个、32个文档中的2个等开头,因此我使用以下代码将文本拆分为不同的文章:

import re 
sections = [] 
current = []
with open("Aberdeen2005.txt") as f:
    for line in f:
        if re.search(r"(?i)\d+ of \d+ DOCUMENTS", line):        
           sections.append("".join(current))
           current = [line]
        else:
           current.append(line)

print(len(sections)) 
我现在试图提取每篇文章的日期。我注意到日期不是在每篇文章开头的第4行就是第5行。因此,我通过以下方式创建具有此相关行的函数:

def main():
    for i in range(len(sections)): 
        date_row4 = (sections[i].split("\n")[4].split(" "))     
        date_row5 = (sections[i].split("\n")[5].split(" "))

        print(date_row4)
        print(date_row5)
这让我得到了以下列表:

我现在只想通过以下方法找到月份和年份:

months = 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'

month = re.findall(r' \w+ months',date_row4 or date_row5)
year = re.findall(r' \d^20', date_row4 or date_row5 )
尽管如此,它仍然不起作用。我刚开始学习Python,所以我可以想象很多事情都出了问题。任何帮助都将不胜感激

亲切问候,


安德烈斯

我不确定我是否会使用正则表达式。
time
模块具有解析日期的工具

>>> import time
>>> time.strptime('December 29, 2005 Thursday', "%B %d, %Y %A").tm_year
2005

如果您有几行遗漏了一周中的某一天,您可以使用
尝试
/
,除了
块,首先使用更常见的案例IIUC,您的问题实际上是从“哪个让我得到下面的列表”开始的。(如果是的话,如果我可以问的话,为什么要这样做)

当然,可以使用
re
非常精确地匹配您的精确模式,但我经常发现,使用它的一小部分功能要容易得多。下面的
exp
使用非常简单的正则表达式:

exp = re.compile(r'(\w+) (\d+), (\d+)')
可用于指定所需的常规形式,并可在中使用:

m = exp.search('December 29, 2005')
if m:
     m.groups() # This contains the match

如果需要,您可以进一步检查匹配的月份是否在
months
变量中(如果您选择执行此操作,我会将其更改为
集)。

仅尝试对正则表达式进行排序,更容易修复的是年份。正则表达式必须按照字符的显示顺序:

假设你所有的年龄都在2000年之后,那么你的表达式是 “20\d\d”

接下来的几个月 不幸的是,您正在执行的操作无法正常工作,您不能仅在正则表达式中使用列表,但修复起来很简单:

 months = ['January', 'February' ] # etc
 pattern = '|'.join(months) # this makes a string which would look like: January|February
 month = re.search(months, date_row4 or date_row5).group() # this will return a string instead of a list
尽管有更好的方法使用datetime模块

import re
for section in sections: 
    date_row4 = section.split("\n")[4].split(" ")     
    date_row5 = section.split("\n")[5].split(" ")

    match = re.search(r'(\w+)\s+\d{1,2},\s+(\d{4})', date_row4)
    if not match:
        match = re.search(r'(\w+)\s+\d{1,2},\s+(\d{4})', date_row5)

    if match:
        month = match.group(1)
        year = match.group(2)

Upd:虽然使用日期格式要好得多。

因为没有零填充日期,例如“4月5日”,所以不起作用-(我的错,你是对的。这比regexp好得多:-)我还建议
datetime.strtime()
。你能发布你的文件的样本吗?你的问题为什么不以“哪个让我得到下面的列表”部分开头?既然OP有
个月的列表,你可以做初始的
(\w+)
更具体地说,插入
“|”。首先加入(月)
@PaulMcGuire,如果你是写pyparsing-kudos的人。我完全同意。然而,我的观点是,有时候你可以从re中受益,而不知道如何做每件事。我是,谢谢实际上,我现在正在编写一个Meetup教程,使用日期解析作为介绍性示例。由于OP已经将输入文件剔除为仅包含日期字符串的行,因此RE可能会执行此操作。我可能会让它更能容忍空格的变化(没有空格,多个空格,等等)——令人惊讶的是,有多少垃圾会爬进“格式良好”的文本文件中。事实上,我们已经看到了这篇关于这方面的文章,因为“日期要么在每篇文章开头的第4行,要么在第5行”。这对你很好,@PaulMcGuire!代码看起来非常好,谢谢!然而,我得到了以下错误:“预期的字符串或类似字节的对象”,并且指向“match=re.search(r'(\w+)\s+\d{1,2}、\s+(\d{4})、daterow4))”的行。你知道为什么吗?@AndresAzqueta
date_row4”)“
有第二个结束括号吗?不需要。如果不是这样,你能在那之前
打印date_row4
吗?没有第二个括号。并且不允许我打印(date_row4)和打印(date_row5)…我发现以下错误:标识中制表符和空格的使用不一致可能与复制粘贴的代码混淆,请尝试在编辑器中打开制表符/空格视图,然后再次检查,它应该是一致的。