【问题标题】:Python regular expression find and output a part of the pattern in multiple timesPython正则表达式多次查找并输出模式的一部分
【发布时间】:2022-01-13 09:50:16
【问题描述】:

假设我有一个字符串如下:

2021/12/23 13:00 14:00 2021/12/24 13:00 14:00 15:00

date 多次与time 一起出现。正则表达式是否有可能在每个date 之后找到所有时间,如下所示?

[('2021/12/23', '13:00','14:00'), ('2021/12/24', '13:00','14:00','15:00')]

我在 Python 中尝试了以下代码,但它只返回第一次:

re.findall(r'(\d+/\d+/\d+)(\s\d+\:\d+)+','2021/12/23 13:00 14:00 2021/12/24 13:00 14:00 15:00')

>>>[('2021/12/23', ' 14:00'), ('2021/12/24', ' 15:00')]

附录: 原来的问题其实是一个比较复杂的情况,时间之间有几个文本,很难直接替换成'':

2021/12/31 14:00 start 15:00 end 17:00 pending 18:00 ok 2021/12/31 14:00 begin 15:00 end  17:00 start 18:00 suspend

所以这里的鲁棒方法应该是this answer

pattern = regex.compile(r'(?P<date>\d{4}/\d+/\d+)(?:\s?(?P<time>(\d+:\d+))\s+([^\d]+))+')
for m in pattern.finditer('2021/12/31 14:00 start 15:00 end 17:00 pending 18:00 ok 2021/12/30 14:00 begin 15:00 end  17:00 ggh 18:00 suspend'):
    print(m.capturesdict())
>>> {'date': ['2021/12/31'], 'time': ['14:00', '15:00', '17:00', '18:00']}
{'date': ['2021/12/30'], 'time': ['14:00', '15:00', '17:00', '18:00']}

【问题讨论】:

    标签: python regex


    【解决方案1】:

    使用re.findall:

    inp = '2021/12/23 13:00 14:00 2021/12/24 13:00 14:00 15:00'
    matches = re.findall(r'\d{4}/\d{2}/\d{2}(?: \d{1,2}:\d{2})*', inp)
    print(matches)
    

    打印出来:

    ['2021/12/23 13:00 14:00', '2021/12/24 13:00 14:00 15:00']
    

    正则表达式的解释:

    \d{4}/\d{2}/\d{2}    match a date in YYYY/MM/DD format
    (?: \d{1,2}:\d{2})*  match a space followed by hh:mm time, 0 or more times
    

    【讨论】:

      【解决方案2】:

      您可以使用这个findall + split 解决方案:

      import re
      
      s = '2021/12/23 13:00 14:00 2021/12/24 13:00 14:00 15:00'
      
      for i in re.findall(r'\d+/\d+/\d+(?:\s\d+\:\d+)+', s): print (i.split())
      

      输出:

      ['2021/12/23', '13:00', '14:00']
      ['2021/12/24', '13:00', '14:00', '15:00']
      

      Code Demo

      \d+/\d+/\d+(?:\s\d+\:\d+)+ 匹配一个日期字符串,后跟 1 个或多个时间字符串。

      你。也可以使用:

      print ([i.split() for i in re.findall(r'\d+/\d+/\d+(?:\s\d+\:\d+)+', s)])
      

      获取输出:

      [['2021/12/23', '13:00', '14:00'], ['2021/12/24', '13:00', '14:00', '15:00']]
      

      【讨论】:

      • 对不起,这个案例只是一个例子,它会比使用split复杂得多。
      • 提供详细信息或更多相关示例。答案基于提出的问题。
      【解决方案3】:

      您可以使用 PyPi 正则表达式库来使以下工作:

      import regex
      pattern = regex.compile(r'(?P<date>\d+/\d+/\d+)(?:\s+(?P<time>\d+:\d+))+')
      for m in pattern.finditer('2021/12/23 13:00 14:00 2021/12/24 13:00 14:00 15:00'):
          print(m.capturesdict())
      

      输出:

      {'date': ['2021/12/23'], 'time': ['13:00', '14:00']}
      {'date': ['2021/12/24'], 'time': ['13:00', '14:00', '15:00']}
      

      请参阅Python demo

      由于 PyPi 正则表达式库不会“忘记”组内的所有捕获,并且如果组已命名,match.capturesdict() 将返回所有组及其捕获的字典。

      【讨论】:

      • 仅供参考:可以通过在终端/控制台窗口中运行 pip install regex(或 pip3 install regex,取决于环境)来安装 PyPi regex 模块。
      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      相关资源
      最近更新 更多