Python中的正则表达式月份和年份搜索
这是我的问题。我有一个包含32篇文章的复杂文本文件。由于每篇文章都以32个文档中的1个、32个文档中的2个等开头,因此我使用以下代码将文本拆分为不同的文章: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
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))”的行。你知道为什么吗?@AndresAzquetadate_row4”)“
有第二个结束括号吗?不需要。如果不是这样,你能在那之前打印date_row4
吗?没有第二个括号。并且不允许我打印(date_row4)和打印(date_row5)…我发现以下错误:标识中制表符和空格的使用不一致可能与复制粘贴的代码混淆,请尝试在编辑器中打开制表符/空格视图,然后再次检查,它应该是一致的。