[英]Python Split/Slice a string into a list while keeping delimeter
我想获取一个字符串并使用分隔符从中创建一个列表,同时保留分隔符。
如果我有"A56-3#AJ4klAP0W"
,我想返回一个以 A 作为分隔符的列表。
[A56-3#, AJ4kl, AP0W]
我尝试过拆分和切片,但没有成功。 我确实做了列表理解以获取每个分隔符的索引列表,但无法用它做很多事情 [0, 6, 11]
您可以使用正则表达式和findall()
function。
>>> re.findall('A?[^A]+', 'A56-3#AJ4klAP0W')
['A56-3#', 'AJ4kl', 'AP0W']
这甚至在字符串不以分隔符开头时也有效。 例如
>>> re.findall('A?[^A]+', '56-3#AJ4klAP0W')
['56-3#', 'AJ4kl', 'AP0W']
说明:( Regex101 )
A? : Zero or one "A"
[^A]+ : Followed by one or more "not A"
使用 f 字符串很容易构建正则表达式:
def get_substrings(delim, s):
rex = f"{delim}?[^{delim}]+"
return re.findall(rex, s)
鉴于:
st="A56-3#AJ4klAP0W"
您可以使用枚举获取每个分隔符的索引:
idx=[i for i,ch in enumerate(st) if ch=='A']
然后使用该索引对字符串进行切片:
>>> [st[x:y] for x,y in zip([0]+idx, idx[1:]+[len(st)])]
['A56-3#', 'AJ4kl', 'AP0W']
# this is how you use the [0,6,11] list in your question
您还可以使用正则表达式拆分:
>>> re.split(r'(?=A)', st)
['', 'A56-3#', 'AJ4kl', 'AP0W']
或者找到满足该条件的子字符串(而不是拆分):
>>> re.findall(r'A*[^A]+', st)
['A56-3#', 'AJ4kl', 'AP0W']
只需将其重新添加:
>>> x = 'A56-3#AJ4klAP0W'
>>> x.split('A')
['', '56-3#', 'J4kl', 'P0W']
>>> ['A'+k for k in x.split('A') if k]
['A56-3#', 'AJ4kl', 'AP0W']
>>>
>>> [f'A{el}' for el in "A56-3#AJ4klAP0W".split('A') if el] ['A56-3#', 'AJ4kl', 'AP0W'] >>>
mystr = "A56-3#AJ4klAP0W" delim = "A" lst = mystr.split(delim) lst = [delim + x for x in lst if x != '']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.