如何使用 python 查找和替换嵌套列表中的字符?
How do i find and replace characters in nested list using python?
我有一个包含时间值的嵌套列表。我想检查并替换不符合时间格式“HH:MM”的时间。我要做的第一步是为没有“:”的数字添加“:00”。我的列表看起来像下面的列表 (mylist)。
mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM], ['y', 7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]
res = [['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]]
我试过这个代码:
for idx, (id,name) in enumerate(mylist):
for n2,j in enumerate(name.split(' - ')) :
if ':' not in j and id not in j:
print(name)
if ":" not in name.split('-')[0] and ":" not in name.split('-')[1]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
name.split('-')[1].split(' ')[1].strip() + ':00' + ' PM'
# print(name)
elif ":" not in name.split('-')[0]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
name.split('-')[1].split(' ')[1].strip() + ' PM'
elif ":" not in name.split('-')[1]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
1].strip() + ':00' + ' PM'
else:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
1].strip() + ' PM'
但出现以下错误:
name.split('-')[1].split(' ')[1].strip() + 'PM'
IndexError: 列表赋值索引超出范围
我该如何解决这个问题?
您使用的整个逻辑是正确的,但您需要用一些正则表达式替换拆分。例如,如果你想确保 x
中的所有时间值都与 :00
一致,你可以这样应用:
test_text = "6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM"
print(re.sub(r'(\s|^)(\d+)(\s)', r':00', test_text))
6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM
这里的任务是插入:00
,所以:
- 首先我们检查它的小时数(字符串的开头或空 space 之后的第一个数字):
(\s|^)
- 然后我们检查它必须是一个数字(或多个数字):
(\d+)
- 然后我们检查它没有分钟(space之后为空):(\s)
- 然后我们提到所有组(
</code>、<code>
、</code>)所以<code>re.sub
不会碰它们,只插入:00
介于两者之间。
您可以对此处的所有可能任务应用相同的逻辑。
另一种方法是通过将时间提取任务应用于输入列表的每个组件来对隐藏任务复杂性的函数进行建模。这是一个解决方案:
我添加了缺少的单引号的您的输入列表:
mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM'], ['y', '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]
定义一个函数 f(),它将解析为 HH:MM 每个输入值(假设它们都用逗号或破折号分隔):
def f(time):
t = re.findall(r'\d+', time)
suffix = ""
if "AM" in time:
suffix = "AM"
elif "PM" in time:
suffix = "PM"
if len(t) > 1:
return ':'.join(t) + suffix
return t[0] + ":00" + suffix
它所做的基本上是使用正则表达式对输入值提取数字,将它们解析为小时和分钟,最后应用正确的后缀(根据要求 empty/AM/PM)。
例如,这将打印您的值:
for ls in mylist:
ls = re.split('-|,', ls[1])
print([f(x) for x in ls])
我有一个包含时间值的嵌套列表。我想检查并替换不符合时间格式“HH:MM”的时间。我要做的第一步是为没有“:”的数字添加“:00”。我的列表看起来像下面的列表 (mylist)。
mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM], ['y', 7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]
res = [['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]]
我试过这个代码:
for idx, (id,name) in enumerate(mylist):
for n2,j in enumerate(name.split(' - ')) :
if ':' not in j and id not in j:
print(name)
if ":" not in name.split('-')[0] and ":" not in name.split('-')[1]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
name.split('-')[1].split(' ')[1].strip() + ':00' + ' PM'
# print(name)
elif ":" not in name.split('-')[0]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
name.split('-')[1].split(' ')[1].strip() + ' PM'
elif ":" not in name.split('-')[1]:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
1].strip() + ':00' + ' PM'
else:
list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
1].strip() + ' PM'
但出现以下错误:
name.split('-')[1].split(' ')[1].strip() + 'PM' IndexError: 列表赋值索引超出范围
我该如何解决这个问题?
您使用的整个逻辑是正确的,但您需要用一些正则表达式替换拆分。例如,如果你想确保 x
中的所有时间值都与 :00
一致,你可以这样应用:
test_text = "6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM"
print(re.sub(r'(\s|^)(\d+)(\s)', r':00', test_text))
6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM
这里的任务是插入:00
,所以:
- 首先我们检查它的小时数(字符串的开头或空 space 之后的第一个数字):
(\s|^)
- 然后我们检查它必须是一个数字(或多个数字):
(\d+)
- 然后我们检查它没有分钟(space之后为空):(\s)
- 然后我们提到所有组(
</code>、<code>
、</code>)所以<code>re.sub
不会碰它们,只插入:00
介于两者之间。
您可以对此处的所有可能任务应用相同的逻辑。
另一种方法是通过将时间提取任务应用于输入列表的每个组件来对隐藏任务复杂性的函数进行建模。这是一个解决方案:
我添加了缺少的单引号的您的输入列表:
mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM'], ['y', '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]
定义一个函数 f(),它将解析为 HH:MM 每个输入值(假设它们都用逗号或破折号分隔):
def f(time):
t = re.findall(r'\d+', time)
suffix = ""
if "AM" in time:
suffix = "AM"
elif "PM" in time:
suffix = "PM"
if len(t) > 1:
return ':'.join(t) + suffix
return t[0] + ":00" + suffix
它所做的基本上是使用正则表达式对输入值提取数字,将它们解析为小时和分钟,最后应用正确的后缀(根据要求 empty/AM/PM)。
例如,这将打印您的值:
for ls in mylist:
ls = re.split('-|,', ls[1])
print([f(x) for x in ls])