Python分割元素时如何保留分隔符?含保留'('的实操问题
分割字符串时保留分隔符'('的解决方案
看起来你想要在分割字符串时保留分隔符(,普通的str.split()和简单的正则分割确实达不到这个效果,我来给你两种常用的实现方式,对应不同的需求场景:
首先先明确你的原字符串:
s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'
场景1:把(留在前一个分割片段的末尾
比如你想要得到这样的结果:
[' playsound3Dwhenpossible(', 'soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
可以用正则的捕获组来实现,因为re.split()会把捕获组里的内容保留在分割结果中,之后我们只需要把相邻的非分隔符片段和分隔符合并即可:
import re split_parts = re.split(r'(\()', s) # 合并相邻的片段和分隔符 result = [] for i in range(0, len(split_parts), 2): if i + 1 < len(split_parts): result.append(split_parts[i] + split_parts[i+1]) else: result.append(split_parts[i]) print(result)
这个方法也适用于字符串中有多个(的情况,比如如果你的字符串是"func1(param1)func2(param2)",会得到['func1(', 'param1)func2(', 'param2)'],完美保留每个(在对应函数名的末尾。
场景2:把(留在后一个分割片段的开头
如果你想要的结果是(紧跟在后面的参数部分开头,比如:
[' playsound3Dwhenpossible', '(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
那直接用正向先行断言的正则分割就可以了,先行断言只会匹配(前面的位置,不会消耗(本身,所以分割后(会完整保留在后面的片段里:
import re result = re.split(r'(?=\()', s) print(result)
为什么你之前尝试的split("?=(")不行?因为你没有把它当作正则表达式来用,str.split()的参数如果是字符串的话,会直接按字面匹配,而(?=\()是正则语法,必须用re.split()来处理才行。
希望这两种方式能解决你的问题!
内容的提问来源于stack exchange,提问作者V.Cozzatella




