【问题标题】:Python Regex Match first date and then SecondPython 正则表达式匹配第一个日期,然后是第二个
【发布时间】:2014-08-27 15:10:32
【问题描述】:

我正在使用 pandas 数据框,并希望根据描述中的日期创建系列、开始日期和结束日期。我正在使用正则表达式来查找日期的出现,但似乎无法找出如何在第一个日期停止然后继续查找第二个日期。

看这里:How to stop at first occurence of match?

给出了答案

(?s)(\d{1,2}/\d{1,2}/\d{2,4}).*

但这对我不起作用,我仍在捕获所有日期,而不仅仅是第一个。

使用

(\d{1,2}/\d{1,2}/\d{2,4})? 

也没有用。

基本上我是想了解

pattern_generic=re.compile('(\d{1,2}\/\d{1,2}\/\d{2,4})')   #perhaps will do start and end)
report['Start Date'] = report['Description'].apply(lambda x: re.findall(pattern_start,x))
report['End Date'] = report['Description'].apply(lambda x: re.findall(pattern_end,x))

不确定这是否是查找第一个和第二个日期并将它们放入列中的最佳方法。感谢任何帮助/建议!

编辑:

澄清示例:我有一个数据框,其标题为“描述”列,其中包含各种项目,例如“从 1/2/13-3/4/15 购买的订阅”。我想将两个日期捕获到两列,开始和结束

 Description                                       Start Date     End Date
 'Purchased Subscription from 1/2/13-3/4/15'        1/2/13        3/4/15

【问题讨论】:

  • 举个例子会更好。
  • 当然,我添加了我正在使用的内容以及我想要实现的目标的示例,如果可以解决问题,请告诉我
  • 所以你的输入中有很多行像'Purchased Subscription from 1/2/13-3/4/15',对吗?
  • @Alexis 你试过把re.findall 改成re.search 吗?

标签: python regex date


【解决方案1】:

我会用这个:

(?s)\b(\d{1,2}/\d{1,2}/\d{2,4})\b-\b(\d{1,2}/\d{1,2}/\d{2,4})\b

开始日期在第 1 组,结束日期在第 2 组。

【讨论】:

    【解决方案2】:
      .*'\s+(\d+\/\d+\/\d+)\s+(\d+\/\d+\/\d+)
    

    试试这个。开始日期将在 group1 中,结束日期在 group2 中。

    查看演示:

    http://regex101.com/r/zN5mL9/1

    【讨论】:

      【解决方案3】:

      你可以使用下面的正则表达式,

      (?s)(\d{1,2}/\d{1,2}/\d{2,4})-(\d{1,2}/\d{1,2}/\d{2,4}).*
      

      DEMO

      将组索引 1 中的字符分配给 Start Date,将组索引 2 分配给 End Date

      >>> s = """'Purchased Subscription from 1/2/13-3/4/15'        1/2/13        3/4/15
      foo 1/2/13-3/4/15'        5/2/13        6/4/15
      1/2/13-3/4/15'        7/2/13        8/4/15
      1/2/13-3/4/15'        9/2/13        10/4/15"""
      >>> m = re.search(r'(?s)(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s)
      >>> m.group(1)
      '1/2/13'
      >>> m.group(2)
      '3/4/15'
      >>> m = re.findall(r'(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s, re.DOTALL)
      >>> m
      [('1/2/13', '3/4/15')]
      

      【讨论】:

      • 嘿!我试过了,但继续收到 NoneType 对象有组的错误,所以它似乎没有找到任何东西......
      • 使用 findall 函数,m = re.findall(r'(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s, re.DOTALL)
      【解决方案4】:

      这是我用来完全解决我的问题的代码:

      data['End Date'] = ''
      data['Start Date']=''
      
      pattern=re.compile('(?s)(\d{1,2}\/\d{1,2}\/\d{2,4}).*?(\d{1,2}\/\d{1,2}\/\d{2,4}).*')
      
      first_list = []
      second_list = []
      for x in data['Product Description']:
        m = re.search(pattern,x)
       if m is None:
            first_list.append('')
            second_list.append('')
       else:
        first_list.append(m.group(1))
        second_list.append(m.group(2))
      
      
      data['Start Date'] = Series(first_list)
      data['End Date'] = Series(second_list)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2015-06-26
        • 1970-01-01
        相关资源
        最近更新 更多