我试图把这个字符串'4-6,10-12,16‘转换成一个列表,看起来像这个4,“,6,10,-”,12,16。在列表中会有一个整数和特殊字符"-“的组合。
我试图在python中使用regex代码,但是只能提取数字,但是,我需要列表中的破折号。我如何在列表中包含带有数字的破折号?
这是我的代码:
interval='4-6,10-12,16'
import re
l=[int(s) for s in re.findall(r'\b\d+\b', interval)]
发布于 2022-05-12 13:14:18
试试这个:
interval='4-6,10-12,16'
import re
l=[int(s) if s.isnumeric() else s for s in re.findall(r'\d+|-', interval)]
l
输出:
[4, '-', 6, 10, '-', 12, 16]
发布于 2022-05-12 13:12:22
您可以使用
import re
interval='4-6,10-12,16'
l=[int(s) if all(c.isdigit() for c in s) else '-' for s in re.findall(r'\d+|-', interval)]
print(l) # => [4, '-', 6, 10, '-', 12, 16]
见Python演示。
详细信息
re.findall(r'\d+|-', interval)
提取数字序列或-
字符int(s) if all(c.isdigit() for c in s) else '-'
要么将数字序列转换为int
,要么将-
作为字符串返回。发布于 2022-05-12 14:19:56
有用的职能:
str.isdigit
(或str.isnumeric
或str.isdecimal
);itertools.groupby
对共享特征的相邻字符进行分组。from itertools import groupby
def tokenize_digits_and_dashes(s):
for k, g in groupby(s, key=lambda c: (c.isdigit(), c == '-')):
if k == (True, False):
yield int(''.join(g))
elif k == (False, True):
yield '-'
print(list(tokenize_digits_and_dashes('4-6,10-12,16')))
# [4, '-', 6, 10, '-', 12, 16]
替代方法
您的字符串已经以逗号,
的形式包含分隔符。这些是有用的!别忽视他们。可以使用str.split
拆分分隔符上的列表。
def tokenize_intervals(s):
for interval in s.split(','):
i = interval.split('-')
if len(i) == 2:
yield tuple(int(''.join(w)) for w in i)
elif len(i) == 1:
x = int(''.join(i[0]))
yield (x, x)
print(list(tokenize_intervals('4-6,10-12,16')))
# [(4, 6), (10, 12), (16, 16)]
https://stackoverflow.com/questions/72216191
复制相似问题