使用分隔符1拆分字符串,使用oth拆分索引[0]

2024-05-13 18:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如何拆分这个多重分隔符而不创建两个列表并附加(这似乎非常影响性能)。你知道吗

string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV'

string.split("|")[0].split(".") + string.split("|")[1:]
Out[156]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV']

简单re.split(r'[.|]')不起作用,因为在字符串的第二部分。你知道吗

string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|D|F.g|.Y|'

re.split(r'[./|]', string)
Out[179]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D', 'F', 'g', '', 'Y', '']

数据NOPQRSTUV可能包含.,但它不是分隔符。管道分隔列的数目可能会增加。但是,总是在第一个|之前,分隔符.在第一个|之后是分开的,只有|是分隔符。你知道吗

几乎没有其他可能的数据组合

string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|DFGR'
string.split("|")[0].split(".") + string.split("|")[1:]
Out[174]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'DFGR']

string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|D.F.GR.'
string.split("|")[0].split(".") + string.split("|")[1:]
Out[176]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D.F.GR.']

string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|D|F.g|.Y|'
string.split("|")[0].split(".") + string.split("|")[1:]
Out[178]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D', 'F.g', '.Y', '']

    string = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|D|F.g|Y|H|J|K|R|Y' 
string.split("|")[0].split(".") + string.split("|")[1:]
Out[181]: ['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D', 'F.g', 
'Y', 'H', 'J', 'K', 'R', 'Y']

Tags: 数据re列表stringout性能splitabcd
2条回答

新答案:

使用re模块:

>>> import re
>>> s = 'ABCD..EFGH.IJKLM|NOPQ|RSTUV|D|F.g|Y|H|J|K|R|Y||'
>>> re.findall(r'(?<=\|)[^|]*|(?:(?<=\.)|\A)[^|.]*', s)
['ABCD', '', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D', 'F.g', 'Y', 'H', 'J', 'K', 'R', 'Y', '', '']

旧答案:

使用new regex module,您可以:

>>> import regex
>>> s = 'ABCD.EFGH.IJKLM|NOPQ|RSTUV|D|F.g|Y|H|J|K|R|Y'
>>> regex.findall(r'\G\.?\K[^.|]+|[^|]+', s)
['ABCD', 'EFGH', 'IJKLM', 'NOPQ', 'RSTUV', 'D', 'F.g', 'Y', 'H', 'J', 'K', 'R', 'Y']

demo

其中\G匹配字符串的开头或上一个匹配后的下一个位置,\K从匹配结果中丢弃左侧的所有字符(这里的可选点)。你知道吗

\G用于强制所有结果在第一个管道之前保持连续。由于模式中没有匹配管道的内容,因此将破坏连续性,并将第二个分支[^|]+用于其他项。你知道吗

注意:同样地,您可以选择使用以下模式确保字符串第二部分的连续性:\|\K[^|]+|[^|.]+(如果字符串第二部分包含很多项,这可能会很有趣)。但是这次不需要使用\G锚点,因为每个相邻项前面都有一个管道。你知道吗

注2:如果要考虑空项,可以将模式更改为:

regex.findall(r'\G(?:\A|\.)\K[^.|]*|[^|]+|(?<=\|)', s)

或者

regex.findall(r'\|\K[^|]*|(?:\.|\A)\K[^|.]*', s)

使用re模块。使用re.split应该可以做到这一点,例如re.split('[|.]', string)

相关问题 更多 >