【问题标题】:How to separate strings using regex?如何使用正则表达式分隔字符串?
【发布时间】:2020-11-15 03:51:41
【问题描述】:

我有一个日期时间字符串,我想将小时格式与分钟格式分开,然后将它们都打印在单独的行上。 代码如下:

import re
from datetime import datetime
ct = datetime.now().strftime("%H:%M")
time = "12:30"
minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M")
minus = datetime.strptime(str(minus),"%H:%M:%S").strftime("%H:%M")
# print(minus)
regex2 = re.compile(r'(\d)+:(\d)+')
match = regex2.search(minus)
print(match.group(0))

如果变量 minus 给出输出:01:22 然后我希望它 01 和 22 打印在不同的行上。

输出应该是这样的:

01

22

【问题讨论】:

  • 很多代码与在单独的行上打印小时一分钟无关。 minus 是您想在这里提出的问题的一部分吗?
  • 嗯?到目前为止,您尝试了什么,结果如何?如果我运行您的脚本,我会收到错误消息,因为您的“减号”值(第 6 行)与您的字符串(“%H:%M:%S”)不匹配。错误消息清楚地说明了这一点。那么,你的问题到底是什么????
  • 我会避免为此使用正则表达式。只有一种变体。只需使用拆分

标签: python string time


【解决方案1】:

你不需要正则表达式。

你可以直接使用timedelta:

from datetime import datetime

ct = datetime.now().strftime("%H:%M")
time = "10:30"

minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M")

## extract whatever values you want from this delta:
## eg:
seconds = minus.seconds
hours = minus.seconds//3600
minutes = (minus.seconds//60)%60

print(hours)
print(minutes)

【讨论】:

    【解决方案2】:

    忽略您的脚本由于第 6 行的运行时错误而失败的事实(这会阻止从脚本的正则表达式部分生成任何输出),要捕获冒号周围的数字,您需要放置重复标记(即加号)在捕获标记(即括号)内。 所以修改你的正则表达式:

    regex2 = re.compile(r'(\d)+:(\d)+')
    

    如下:

    regex2 = re.compile(r'(\d+):(\d+)')
    

    会实现的。

    您需要做的第二件事是打印匹配的组(而不是整个匹配的文本 - 即 group(0))。 打印第一个和第二个匹配组的实现如下:

    print(match.group(1))
    print(match.group(2))
    

    您的正则表达式和我的正则表达式之间的区别在于最终会在匹配中生成的组数。 在您的情况 (\d)+ 中,您请求创建一个或多个单个数字组。 在我的情况下 (\d+),我请求创建包含一个或多个数字的单个组。然后我使用这种模式两次 - 在冒号的每一侧使用一次。

    因此,对于像 01:22 这样的输入,您将创建 4 个组,分别是“0”、“1”、“2”和“2”。而我的正则表达式只会生成 2 组“01”和“22”。我认为这就是您想要实现的目标。

    请注意,如果您输入了“0:122”这样的输入,您的正则表达式将生成相同的 4 个组(“0”、“1”、“2”和“2”)——您不知道“:”字符在哪里,除非您也捕获了它(冒号)。在我的 RE 中,输入“0:122”会生成“0”和“122”,从而正确地通知您冒号的位置(即在“0”和“122”之间

    【讨论】:

      【解决方案3】:

      使用下面的正则表达式:

      '([^:]+)'
      

      在此处查看正则表达式说明:https://regex101.com/r/EgXlcD/46

          import re
          from datetime import datetime
          ct = datetime.now().strftime("%H:%M")
          time = "10:30"
          minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M")
          minus = datetime.strptime(str(minus),"%H:%M:%S"
                                               "").strftime("%H:%M")
          #print(minus)
          
          matches = re.findall(r'([^:]+)',minus)
          for match in matches:
              print (match)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2015-07-19
        相关资源
        最近更新 更多