【问题标题】:How to search for string between whitespace and marker? Python如何在空格和标记之间搜索字符串? Python
【发布时间】:2021-04-07 10:08:17
【问题描述】:

我的问题如下: 我有字符串:

datetime = "2021/04/07 08:30:00"

我想保存可变小时,08 和 我想保存可变分钟数,30

我所做的如下:

import re
 
pat = re.compile(' (.*):')
hour = re.search(pat, datetime)
minutes = re.search(pat, datetime)
print(hour.group(1))
print(minutes.group(1))

我从印刷品中得到的是 08:3030,所以分钟是正确的,但由于某种我不明白的原因,在几个小时内,第一个 : 被跳过,并将所有内容从空格带到第二个 :

我做错了什么?谢谢。

【问题讨论】:

  • 你为什么不用minutes = datetime.split(':')[1]hours = datetime.split(':')[0][-2:]
  • 请考虑编译正则表达式模式而不是多次评估它,这样可以在复杂模式中节省大量计算时间。
  • 如果任何给出的答案有助于解决问题,请点击左侧的 ✓ 关注accept an answer。请注意,您会得到 2 reputation points 接受解决方案。

标签: python datetime substring python-re


【解决方案1】:

请使用 datetime 模块中的strptime,这是在 python 中处理字符串日期的推荐方法。

strptime 从字符串 date 返回一个 datetime 对象,这个 datetime 对象带有各种好东西,如 datetimehourisoformattimestamp 等日期时间微风。

datetime.datetime.strptime("2021/04/07 08:30:00", "%Y/%m/%d %H:%M:%S")
datetime.datetime(2021, 4, 7, 8, 30)
datetime.datetime.strptime("2021/04/07 08:30:00", "%Y/%m/%d %H:%M:%S").hour
8
datetime.datetime.strptime("2021/04/07 08:30:00", "%Y/%m/%d %H:%M:%S").second
0

【讨论】:

    【解决方案2】:

    啊,不,python 对 datetime.strptime 有更好的方法

    https://www.programiz.com/python-programming/datetime/strptime

    所以对你来说:

    from datetime import datetime
    
    dt_string = "2021/04/07 08:30:00"
    
    # Considering date is in dd/mm/yyyy format
    dt_object1 = datetime.strptime(dt_string, "%Y/%m/%d %H:%M:%S")
    

    你想要几个小时?

    hours = dt_object1.hour
    

    还是分钟?

    mins = dt_object1.minute
    

    现在,如果您所展示的只是您需要解决空白的示例,那么您可以拆分字符串。再次使用 dt_string:

    dt_string1 = dt_string.split(" ")
    dateString = dt_string1.split("/")  # A list in [years, months, days]
    timeString = dt_string2.split(":")  # A list in [hours, minutes, seconds]
    

    【讨论】:

      【解决方案3】:

      通配符. 匹配任何单个字符,甚至是:。所以.* 匹配08:30

      用途:

      hour = re.search('\ ([0-9]*):', datetime)
      

      输出:

      >>> hour.group(1)
      '08'
      

      【讨论】:

        【解决方案4】:

        您可以尝试下面的正则表达式使其不贪婪并首先停止

        hour = re.search(' (.*?):', datetime)
        

        【讨论】:

          【解决方案5】:

          您正在做的另一种方法是将原始日期时间按空格拆分为诸如日期之类的变量,这将为您提供 ['2021/04/07', '08:30:00']。然后,您可以访问列表变量 dates 的第二个值并用“:”再次拆分它,以获取单个时间,并从变量 time 访问列表可变时间的小时、分钟和秒的部分。

          datetime = "2021/04/07 08:30:00"
          
          dates = datetime.split(" ")
          print(dates)
          
          time = dates[1].split(":")
          print(time)
          

          打印代码会给你

          打印(日期)--> ['2021/04/07', '08:30:00']

          打印(时间) --> ['08', '30', '00']

          您可以使用 time[0] 访问“08”的各个部分,time[1] 访问“30”等。

          【讨论】:

            【解决方案6】:

            我会将re.compile 与命名的捕获组一起使用并进行迭代:

            inp = "Hello World 2021/04/07 08:30:00 Goodbye"
            r = re.compile(r'\b\d{4}/\d{2}/\d{2} (?P<hour>\d{2}):(?P<minute>\d{2}):\d{2}\b')
            output = [m.groupdict() for m in r.finditer(inp)]
            print(output[0]['hour'])    # 08
            print(output[0]['minute'])  # 30
            

            【讨论】:

              【解决方案7】:

              这是一个简单的日期时间问题。 Python 已经能够完全满足您的需求。 3个步骤:

              • 使用strptime 从您的字符串生成日期时间。
              • 你可以得到格式化选项here
              • 只返回日期时间对象的小时或分钟
              from datetime import datetime
              
              dt_string = "2021/04/07 08:30:00"
              dt_object = datetime.strptime(dt_string, "%Y/%m/%d %H:%M:%S")
              
              print(dt_object)
              print(dt_object.hour, dt_object.minute)
              
              # 2021-04-07 08:30:00
              # 8 30
              

              【讨论】:

                【解决方案8】:

                在某些情况下,如果您需要处理字符串,您可以使用 Striptime 来执行该操作,您可以使用 +[这里的内容是什么,您可以在此处输入,例如 0-7 或 a-z 或 A-Z 或符号] +

                import re
                datetime = "2021/04/07 08:30:00"
                #here you need to make a change
                hour = re.search(' (.*):+[0-7]+:', datetime)
                minutes = re.search(':(.*):', datetime)
                print(hour.group(1))
                print(minutes.group(1))
                

                【讨论】:

                  猜你喜欢
                  • 2021-09-13
                  • 1970-01-01
                  • 2014-08-21
                  • 2016-04-30
                  • 1970-01-01
                  • 2016-01-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-25
                  相关资源
                  最近更新 更多