如何在python中通过保留分隔符来拆分元素

如何在python中通过保留分隔符来拆分元素,python,Python,嗨,我如何在保留“(”)的同时拆分此字符串: 我还尝试了: x = s.split("?=(") 但它没有起作用 谢谢如果您只需要保留分隔符,可以在拆分后重新引入: def split_keep_separator(source, sep): elements = source.split(sep) return [e for t in zip(elements, [sep] * (len(elements))) for e in t][:-1] 为了测试它: s = ' p

嗨,我如何在保留“(”)的同时拆分此字符串:

我还尝试了:

x = s.split("?=(")
但它没有起作用


谢谢

如果您只需要保留分隔符,可以在拆分后重新引入:

def split_keep_separator(source, sep):
    elements = source.split(sep)
    return [e for t in zip(elements, [sep] * (len(elements))) for e in t][:-1]
为了测试它:

s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'

x = split_keep_separator(s, "(")
print(x)

# [' playsound3Dwhenpossible',
#  '(',
#  'soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']

如果要在输出数组中保留分隔符“(”,最简单的方法是使用正则表达式拆分

import re
s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'
x = re.split(r'(\()', s)

根据您的输入字符串,您的预期输出可能是

[' playsound3Dwhenpossible', '(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
如果是这样,这对我来说似乎是最简单的

s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'
print s.replace("(","*(").split('*')
首先替换,然后拆分


您可以使用原始字符串中而不是
'*'
的任何内容来代替

另一个基于正则表达式的解决方案:

import re

s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'
splits = re.findall(r'(\(?[^(]+)', s)
print(splits)
输出:

[' playsound3Dwhenpossible', '(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
['(', '(asda', '(', '(asfasf']
[' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
或者,如果您希望具有通用(或易于使用)功能:

split_keep = lambda s, sep : re.findall('({0}?[^{0}]+)'.format(re.escape(sep)), s)
splits = split_keep(s, '(')
在具有多个连续分隔符的情况下,此操作失败。以下稍微复杂的函数修复了此问题:

split_keep = lambda s, sep : re.findall('({0}[^{0}]*|{0}?[^{0}]+)'.format(re.escape(sep)), s)
print(split_keep('((asda((asfasf', '('))
输出:

[' playsound3Dwhenpossible', '(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
['(', '(asda', '(', '(asfasf']
[' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']

您可能会将拆分稍微更改为:

s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'

x = s.split(r'\(') #raw
print(x)
输出:

[' playsound3Dwhenpossible', '(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']
['(', '(asda', '(', '(asfasf']
[' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);']

在您的例子中,“保留分隔符”是什么意思?分隔符作为结果列表中的一个单独元素或与相邻元素之一相连?为什么要保留分隔符?如果使用正则表达式和组从字符串中提取信息以提取它们。