python分割字符串保留分隔符_在Python中,如何分割一个string并保留分隔符?

本文介绍Python中使用不同方法进行字符串分割的技巧,包括利用正则表达式、自定义函数及列表解析等方式,保持分隔符并处理复杂字符串。
部署运行你感兴趣的模型镜像

>>> re.split('(\W)', 'foo/bar spam\neggs') ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']

如果你正在拆分换行符,使用splitlines(True) 。

>>> 'line 1\nline 2\nline without newline'.splitlines(True) ['line 1\n', 'line 2\n', 'line without newline']

(不是一个通用的解决scheme,但在这里添加这个,以防有人来这里没有实现这个方法。)

另一个没有正则expression式的解决scheme,在Python 3上运行良好

# Split strings and keep separator test_strings = ['', 'Hi', '', ''+unicode_max_char+'' print(split_and_keep(ridiculous_string, '

# This keeps all separators in result ########################################################################## import re st="%%(c+dd+e+f-1523)%%7" sh=re.compile('[\+\-//\*\\%\(\)]') def splitStringFull(sh, st): ls=sh.split(st) lo=[] start=0 for l in ls: if not l : continue k=st.find(l) llen=len(l) if k> start: tmp= st[start:k] lo.append(tmp) lo.append(l) start = k + llen else: lo.append(l) start =llen return lo ############################# li= splitStringFull(sh , st) ['%%(', 'c', '+', 'dd', '+', 'e', '+', 'f', '-', '1523', ')%%', '7']

你也可以用一个string数组而不是一个正则expression式来分割一个string,如下所示:

def tokenizeString(aString, separators): #separators is an array of strings that are being used to split the the string. #sort separators in order of descending length separators.sort(key=len) listToReturn = [] i = 0 while i < len(aString): theSeparator = "" for current in separators: if current == aString[i:i+len(current)]: theSeparator = current if theSeparator != "": listToReturn += [theSeparator] i = i + len(theSeparator) else: if listToReturn == []: listToReturn = [""] if(listToReturn[-1] in separators): listToReturn += [""] listToReturn[-1] += aString[i] i += 1 return listToReturn print(tokenizeString(aString = "\"\"\"hi\"\"\" hello + world += (1*2+3/5) '''hi'''", separators = ["'''", '+=', '+', "/", "*", "\\'", '\\"', "-=", "-", " ", '"""', "(", ")"]))

如果你想分割string,而保持分隔符正则expression式不捕获组:

def finditer_with_separators(regex, s): matches = [] prev_end = 0 for match in regex.finditer(s): match_start = match.start() if (prev_end != 0 or match_start > 0) and match_start != prev_end: matches.append(s[prev_end:match.start()]) matches.append(match.group()) prev_end = match.end() if prev_end < len(s): matches.append(s[prev_end:]) return matches regex = re.compile(r"[\(\)]") matches = finditer_with_separators(regex, s)

如果假定正则expression式被包含进捕获组中:

def split_with_separators(regex, s): matches = list(filter(None, regex.split(s))) return matches regex = re.compile(r"([\(\)])") matches = split_with_separators(regex, s)

这两种方式也将删除在大多数情况下无用和烦人的空组。

如果你只有一个分隔符,你可以使用列表parsing:

text = 'foo,bar,baz,qux' sep = ','

附加/预先分隔符:

result = [x+sep for x in text.split(sep)] #['foo,', 'bar,', 'baz,', 'qux,'] # to get rid of trailing result[-1] = result[-1].strip(sep) #['foo,', 'bar,', 'baz,', 'qux'] result = [sep+x for x in text.split(sep)] #[',foo', ',bar', ',baz', ',qux'] # to get rid of trailing result[0] = result[0].strip(sep) #['foo', ',bar', ',baz', ',qux']

分隔符是它自己的元素:

result = [u for x in text.split(sep) for u in (x, sep)] #['foo', ',', 'bar', ',', 'baz', ',', 'qux', ','] results = result[:-1] # to get rid of trailing

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 首先,用户的问题是关于Python的 `partition` 方法如何处理分隔符。问题具体是:"Python 的 `partition` 方法在分割字符串时如何处理分隔符?" 我需要回忆一下 `partition` 方法的定义和行为。`partition(sep)` 是字符串对象的方法,用于分割字符串。它将字符串分成三部分:分隔符前的部分、分隔符本身、以及分隔符后的部分。如果分隔符字符串中找到,则返回一个包含三个元素的元组:(before_sep, sep, after_sep)。如果分隔符没有找到,则返回一个元组:(original_string, '', '')。 关键点: - 它总是返回一个三元组。 - 它只分割一个出现的分隔符。 - 如果分隔符不存在,返回的元组中,第一部分是整个字符串,后两部分是空字符串。 现在,我需要按照指定的回答格式: 1. 回答问题:给出直接的回答。 2. 给出解释:详细解释行为。 3. 提供Python代码示例来演示。 4. 最后,提出相关问题(格式必须严格遵守)。 回答格式应该以回答问题开始,然后解释,最后有相关问题。相关问题必须用指定的格式: ``` §§相关问题§§: 1. ··· 2. ··· 3. ··· 4. ··· ``` 由于用户的问题是关于 `partition` 如何处理分隔符,我应该专注于这个方法。但为了完整性,我可以简要提及相关方法如 `rpartition`、`split` 等,但主要焦点是 `partition`。 结构化我的回答: - 先回答核心问题:`partition` 方法如何处理分隔符? - 解释行为: - 当分隔符存在时:分割为三部分。 - 当分隔符不存在时:整个字符串作为第一部分,后两部分为空。 - 它是从左到右搜索第一个匹配。 - 提供代码示例。 然后,提出相关问题。相关问题应该与字符串分割相关,并且基于上下文(之前的用户消息中提到过 `rpartition`, `split`, `rsplit`, `splitlines`),我应该包括一些相关话题。 相关问题建议: 1. 关于 `rpartition` 的行为。 2. `partition` 和 `split` 的区别。 3. 当分隔符是空字符串时会发生什么?(但注意,`partition` 不允许空字符串分隔符,会引发 ValueError。) 4. `partition` 在字符串开头或结尾时的行为。 确保问题数量是4个。 现在,编写回答: - 回答问题:Python的 `partition` 方法在分割字符串时,会搜索指定分隔符 sep 在字符串中第一次出现的位置。如果找到,则返回一个元组 (before_sep, sep, after_sep);如果没有找到,则返回 (original_string, '', '')。 - 解释:详细描述。 - 代码示例:展示两种情况。 代码: ```python # 示例1:分隔符存在 s = "hello:world" result = s.partition(':') print(result) # 输出:('hello', ':', 'world') # 示例2:分隔符不存在 s = "hello world" result = s.partition(':') print(result) # 输出:('hello world', '', '') ``` 最后,相关问题: ``` §§相关问题§§: 1. Python 的 `rpartition` 方法与 `partition` 有何不同? 2. 当分隔符字符串开头或结尾时,`partition` 的行为是什么? 3. `partition` 和 `split` 方法在功能上有什么区别? 4. 如果尝试使用空字符串作为分隔符调用 `partition`,会发生什么? ``` 确保整个回答用中文,因为用户的问题是中文的。 </think> ### Python 的 `partition` 方法处理分隔符的方式 `partition(sep)` 是 Python 字符串方法,用于基于指定分隔符 `sep` 分割字符串。它的核心行为是: - **搜索方向**:从左到右搜索第一个匹配的分隔符。 - **返回结果**:无论是否找到分隔符,**总是返回一个三元组** `(before_sep, sep, after_sep)`。 - **分隔符存在时**:将字符串分为三部分(分隔符前的内容、分隔符本身、分隔符后的内容)。 - **分隔符不存在时**:返回 `(原始字符串, '', '')`。 - **分隔符处理**:分隔符 `sep` 必须是**非空字符串**,否则会引发 `ValueError`。分隔符本身作为一个独立部分保留在结果中。 #### 代码示例 ```python # 场景1:分隔符存在(正常分割) s1 = "apple:banana:cherry" result1 = s1.partition(':') # 搜索第一个 ':' print(result1) # 输出:('apple', ':', 'banana:cherry') # 场景2:分隔符不存在(返回完整字符串和空部分) s2 = "hello world" result2 = s2.partition('@') print(result2) # 输出:('hello world', '', '') # 场景3:分隔符在开头或结尾 s3 = ":start_middle_end:" result3 = s3.partition(':') # 第一个分隔符在位置0 print(result3) # 输出:('', ':', 'start_middle_end:') # 场景4:空分隔符(引发错误) try: s4 = "test" result4 = s4.partition('') # 空字符串作为分隔符 except ValueError as e: print(f"错误: {e}") # 输出:错误: empty separator ``` #### 关键行为解释 1. **固定三元组输出**: - 无论分隔符是否找到,结果始终是长度为 3 的元组。这确保了代码在处理分割结果时无需额外检查长度(例如 `split()` 可能返回不同长度的列表)。 2. **只处理第一个匹配项**: - `partition` 只分割**第一个出现**的分隔符。后续的分隔符会被保留在 `after_sep` 部分(如示例中的 `'banana:cherry'`)。 3. **空字符串处理**: - 如果分隔符字符串开头(如 `s3.partition(':')`),`before_sep` 部分为空字符串 `''`。 - 如果分隔符在结尾(如 `"end:".partition(':')`),`after_sep` 部分为空字符串 `''`。 4. **错误处理**: - 分隔符 `sep` 不能为空字符串,否则引发 `ValueError`(因为空分隔符在逻辑上无意义)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值