首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拆分字符串并保留分隔符,分隔符连续出现。

拆分字符串并保留分隔符,分隔符连续出现。
EN

Stack Overflow用户
提问于 2022-02-14 23:02:05
回答 2查看 61关注 0票数 2

我有以下字符串:

代码语言:javascript
运行
复制
bar = 'F9B2Z1F8B30Z4'

我有一个函数foo,它在F上拆分字符串,然后添加回F分隔符。

代码语言:javascript
运行
复制
def foo(my_str):
    res = ['F' + elem for elem in my_str.split('F') if elem != '']
    return res

这是有效的,除非在字符串中有两个“F”背对背。例如,

代码语言:javascript
运行
复制
foo('FF9B2Z1F8B30Z4')

返回

代码语言:javascript
运行
复制
['F9B2Z1', 'F8B30Z4']

(未处理字符串开头的双"F“)

我希望将函数拆分到第一个"F“中,并将其添加到列表中,如下所示:

代码语言:javascript
运行
复制
['F', 'F9B2Z1', 'F8B30Z4']

如果字符串中间有一个双"F“,那么所需的行为是:

代码语言:javascript
运行
复制
foo('F9B2Z1FF8B30Z4')

['F9B2Z1', 'F', 'F8B30Z4']

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-14 23:07:16

不要使用筛选if,而是使用切片,因为空字符串只在开始时是一个问题:

代码语言:javascript
运行
复制
def foo(my_str):
    res = ['F' + elem for elem in my_str.split('F')]
    return res[1:] if my_str and my_str[0]=='F' else res

输出:

代码语言:javascript
运行
复制
>>> foo('FF9B2Z1F8B30Z4')
['F', 'F9B2Z1', 'F8B30Z4']

>>> foo('FF9B2Z1FF8B30Z4FF')
['F', 'F9B2Z1', 'F', 'F8B30Z4', 'F', 'F']

>>> foo('9B2Z1F8B30Z4')
['F9B2Z1', 'F8B30Z4']

>>> foo('')
['F']
票数 3
EN

Stack Overflow用户

发布于 2022-02-15 02:38:17

使用regex可以用

代码语言:javascript
运行
复制
import re

pattern = r'^[^F]+|(?<=F)[^F]*'

^[^F]+捕获不以F开头的字符串开头的所有字符。

(?<=F)[^F]*捕获F之后的任何内容,只要它不是F字符,包括空匹配。

代码语言:javascript
运行
复制
>>> print(['F' + x for x in re.findall(pattern, 'abcFFFAFF')])
['Fabc', 'F', 'F', 'FA', 'F', 'F']

>>> print(['F' + x for x in re.findall(pattern, 'FFabcFA')])
['F', 'Fabc', 'FA']

>>> print(['F' + x for x in re.findall(pattern, 'abc')])
['Fabc']

请注意,对于空字符串,这不会返回任何内容。如果空字符串需要返回['F'],则模式可以更改为pattern = r'^[^F]+|(?<=F)[^F]*|^$',添加^$以捕获空字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71119260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档