使用 python 在嵌套列表中的字符前添加字符串

Add string before character in nested list using python

我有一长串嵌套的时间列表。我想在列表(如结果列表)中的一位数时间之前添加“0”。我试过下面的代码块,但它不起作用。我知道使用正则表达式是解决该问题的最佳方法。但是我没有任何 re 包的经验。如何使用 re 软件包或任何其他解决方案解决问题?

mylist = [
    ['x', '6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM'],
    ['y',  '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']
]

result = [
    ['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'],
    ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']
]


for idx, (id,name) in enumerate(list3):
    if  len(name.split('-')[0].split(':')[0]) <2 and  len(name.split('-')[1].split(':')[0]) <3:
         list3[idx][1] = '0'+name.split('-')[0] + ' - ' + '0'+ name.split('-')[1].strip()
         # print 1
    if len(name.split('-')[0].split(':')[0]) < 2 and len(name.split('-')[1].split(':')[0]) == 3:
        list3[idx][1] = '0' + name.split('-')[0] + ' - ' +  name.split('-')[1].strip()
    if len(name.split('-')[0].split(':')[0]) == 2 and len(name.split('-')[1].split(':')[0]) < 3:
        list3[idx][1] =  name.split('-')[0] + ' - ' + '0'+name.split('-')[1].strip()

试试这个正则表达式:

import re

mylist = [['x', '6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM'], ['y',  '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']] 

result = [['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'], ['y',  '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]


for idx, (id,name) in enumerate(mylist):
    mylist[idx][1] = re.sub(r"(?<!\d)(\d:\d{2})", r"", mylist[idx][1])

# result:
[['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'], ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]

我为一个字符串定制了一个解决方案,把它放在一个函数中并在每个字符串上激活:

import re
str = '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM'
newStr = ""
isLead  = False
for char in str:
    if not isLead:
        if re.match("[0-9]", char ):
            isLead = True
            newStr += "0"
    if char == "M":
        isLead = False
    newStr += char

print(newStr)

如果实在不想用正则表达式-

char.isnumeric() 

应该也可以

正如评论中提出的那样,解决问题的正确方法是使用时间解析工具,而不是正则表达式:

from datetime import datetime as dt
from dateutil import parser

def fmt_time(t):
    return dt.strftime(parser.parse(t), "%I:%M %p")

result = [[item[0], 
           " - ".join(fmt_time(t) for t in item[1].split("-"))] 
          for item in mylist]

没有正则表达式:

mylist = [['x', '6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM'], ['y',  '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']] 
result = []

for x in mylist:
  res = x[0]
  s = []
  for y in x[1].split(' '):
    if len(y) == 4:
      t = '0' + y 
      s.append(t)
    else:
      s.append(y)
  s = ' '.join(s)
  result.append([res,s])

print(result)

遍历给定列表(我的列表),存储第一个元素(x 或 y),然后拆分时间列表并遍历该列表。如果当前字符串的长度是 4 那么它需要在开头添加一个零,添加零并附加到新字符串,否则添加到新字符串 s。将字符串添加到结果中。 lmk 如果你有任何问题,我知道解释可能会更好一些,但代码应该很容易阅读。无论如何,这都不是最有效的解决方案,并且仅在时间列表字符串的格式相对不变时才有效(因此所有需要零的时间的长度始终为 4,并且拆分字符串中的其他元素都不会为长度共 4 个)。

试试这个,(\d+?:) 会匹配 06:, 09:, 10: .. 然后使用 rjust 作为前缀零的

import re

mylist = [['x', '6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM'],
          ['y', '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]

print(
    [[re.sub("(\d+?:)", lambda m: m.group(1).rjust(3, '0'), y) for y in x]
     for x in mylist]
)

[['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'],
 ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]