如何通过保持分隔符来拆分python中的元素

时间:2018-04-24 09:46:32

标签: python

您如何在保持'(':

)的同时拆分此字符串
s = ' playsound3Dwhenpossible(soundspotpoint18, %$videos_sounds_path%/sounds/lavazza_-_auguri_cherubini__15_.mp3, true, false, -52.644483, 0.947368, 90, 1, spotpoint18);'
x = s.split("(")
print(x)

我也尝试过:

x = s.split("?=(")

但它不起作用。

谢谢

5 个答案:

答案 0 :(得分:0)

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

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);']

答案 1 :(得分:0)

如果你想保留分隔符'('在输出数组中,最简单的方法是使用正则表达式分割。

env CL_CONTEXT_EMULATOR_DEVICE_ALTERA=1 gdb ./host

答案 2 :(得分:0)

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

[' 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('*')

首先替换而不是拆分。

您可以使用原始字符串中的 NOT ,而不是'*'

答案 3 :(得分:0)

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

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);']

或者如果你想拥有通用(或易于使用)的功能:

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', '('))

输出:

['(', '(asda', '(', '(asfasf']

答案 4 :(得分:0)

您可以稍微将分割更改为:

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);']