当前位置: 首页 > 面试题库 >

使用正则表达式提取格式不同的日期并对它们进行排序-Pandas

花永昌
2023-03-14
问题内容

我是文本挖掘的新手,我需要从* .txt文件中提取日期并对它们进行排序。日期在句子之间(每行),其格式可能如下:

04/20/2009; 04/20/09; 4/20/09; 4/3/09
Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
Feb 2009; Sep 2009; Oct 2010
6/2008; 12/2009
2009; 2010

如果缺少日期,请考虑1日;如果缺少月份,请考虑1月。

我的想法是提取所有日期并将其转换为mm / dd / yyyy格式。但是,我对如何查找和替换模式有些怀疑。这是我所做的:

import pandas as pd

doc = []
with open('dates.txt') as file:
    for line in file:
        doc.append(line)

df = pd.Series(doc)

df2 = pd.DataFrame(df,columns=['text'])

def myfunc(x):
    if len(x)==4:
        x = '01/01/'+x
    else:
        if not re.search('/',x):
            example = re.sub('[-]','/',x)
            terms = re.split('/',x)
            if (len(terms)==2):
                if len(terms[-1])==2:
                    x = '01/'+terms[0]+'/19'+terms[-1]
                else:
                    x = '01/'+terms[0]+'/'+terms[-1] 
            elif len(terms[-1])==2:
                x = terms[0].zfill(2)+'/'+terms[1].zfill(2)+'/19'+terms[-1]
    return x

df2['text'] = df2.text.str.replace(r'(((?:\d+[/-])?\d+[/-]\d+)|\d{4})', lambda x: myfunc(x.groups('Date')[0]))

我只对数字日期格式进行过处理。但是我对如何用机油日期感到困惑。

我知道这是一个粗糙的代码,但这就是我所得到的。


问题答案:

我认为这是Coursera文本挖掘作业之一。好了,您可以使用正则表达式并提取以获取解决方案。dates.txt,即

doc = []
with open('dates.txt') as file:
    for line in file:
        doc.append(line)

df = pd.Series(doc)

def date_sorter():
    # Get the dates in the form of words
    one = df.str.extract(r'((?:\d{,2}\s)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*(?:-|\.|\s|,)\s?\d{,2}[a-z]*(?:-|,|\s)?\s?\d{2,4})')
    # Get the dates in the form of numbers
    two = df.str.extract(r'((?:\d{1,2})(?:(?:\/|-)\d{1,2})(?:(?:\/|-)\d{2,4}))')
    # Get the dates where there is no days i.e only month and year  
    three = df.str.extract(r'((?:\d{1,2}(?:-|\/))?\d{4})')
    #Convert the dates to datatime and by filling the nans in two and three. Replace month name because of spelling mistake in the text file.
    dates = pd.to_datetime(one.fillna(two).fillna(three).replace('Decemeber','December',regex=True).replace('Janaury','January',regex=True))
return pd.Series(dates.sort_values())

date_sorter()

输出:

9 1971-04-10
84 1971-05-18
2 1971-07-08
53 1971-07-11
28 1971-09-12
474 1972-01-01
153 1972-01-13
13 1972-01-26
129 1972-05-06
98 1972-05-13
111 1972-06-10
225 1972-06-15
1972年7月31日
171 1972-10-04
191 1972-11-30
486 1973-01-01
335 1973-02-01
415 1973-02-01
36 1973-02-14
405 1973-03-01
323 1973-03-01
422 1973-04-01
375 1973-06-01
380 1973-07-01
345 1973-10-01
57 1973-12-01
481 1974-01-01
436 1974-02-01
104 1974-02-24
299 1974-03-01

如果只想返回索引,则 return pd.Series(dates.sort_values().index)

解析第一个正则表达式

 #?:非捕获组

((?:\ d {,2} \ s)?#两位数字组。`?表示在前的令牌或组。此处的2或1数字和空格出现一次或更少。

 (?:Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec)[az] *#组中以任意字母[[]`结尾的单词出现了多次( *)。

 (?:-| \。| \ s |,)#模式匹配-,。,space

 \ s?#(`?`这里只暗示空格,即前面的标记)

 \ d {,2} [az] *#小于等于两个数字,末尾有任意数量的字母(*)。(例如:可能是1月1日,13日,22日,1月,12月等)。

 (?:-|,| \ s)?#字符-/,/ space可能只出现一次,而由于末尾的'?`可能不会出现

 \ s?#空间可能存在或根本不存在(最大为1)(这里的“?”仅指空间)

 \ d {2,4})#匹配数字2或4

希望能帮助到你。



 类似资料:
  • 上节课我们学习了如何使用 BeautifulSoup 来解析页面,这节课我们来学习下如何使用正则来解析页面。 正则表达式的基本概念 正则表达式基本语法 正则表达式常用函数 通过学习正则表达式几个常用函数,可以根据需要对数据进行匹配筛选。 1. 正则表达式简介 在编写爬虫的过程中,我们需要解析网页的内容。那么作为文本解析利器的正则表达式当然可以运用到我们的爬虫开发中。其实页面解析过程无非是从海量的字

  • 有几个问题,但没有回答我的问题。我希望使用pattern和matcher在字符串中找到一个模式,然后从那里创建一个匹配列表,其中包括不匹配的其余部分。 我目前的结果: 假的 我的预期结果应该在列表中: ["125t","160f"]//我知道如何在python中做到这一点,但不知道如何在java中做到这一点。所以有人能帮我吗?

  • 问题内容: 我需要使用正则表达式验证格式的日期字符串。 此正则表达式验证,但无效日期无效,例如: 什么是在年支持下验证格式的有效正则表达式? 问题答案: 您粘贴的正则表达式无法正确验证leap年,但同一篇文章中有。我修改了它采取,或。 我在Arun在他的答案 以及此处提供的链接中对其进行了一些测试,它似乎有效。 编辑2019年2月14日:我删除了正则表达式中的逗号,该逗号允许日期如下 29-0,-

  • 问题内容: 我要匹配具有以下格式的日期: 2010-08-27、2010 / 08/27 现在,我对实际可行的日期不是很确定,只是日期格式正确。 请告知正则表达式。 谢谢 问题答案: 您可以使用模块来解析日期: 输出: 因此,捕获将告诉您日期是否匹配: 为了允许使用各种格式,您可以测试所有可能性,或者先解析字段:

  • 问题内容: 我需要从此字符串中提取日期: BB通知:在04/10的11:28购买您的壁虱,最终卡号xxxx,$ 00,00。如果您不认识,请致电40032 2412。 也是整个日期04/04/2015 日期格式为dd / MM或dd / MM / yyyy 代码: String mydata =“ BB告知:在04/10的11:28,购买您的tickect,最终卡号xxxx,$ 00,00。如果您

  • 我得到了一个日期字段格式为的对象,我将其映射到一个对象中,如下所示: 现在我需要将这个对象作为json响应发送,但我需要它采用不同的格式: 如果我更改字段,反序列化失败: 如何使用不同的模式进行序列化