如何在不创建两个列表和附加的情况下拆分这个多分隔符,这似乎是非常有性能的操作。
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', '']
数据NOPQ
和RSTUV
可能包含.
但不是分隔符。管道分隔列的数量可能会增加。但是,总是在|
之后,分隔符.
在第一个|
|
之后才会出现分隔符。
数据可能没有其他可能的组合,
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']
答案 0 :(得分:3)
新答案:
使用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']
\G
匹配字符串的开头或上一个匹配后的下一个位置,\K
会从匹配结果中丢弃左侧的所有字符(此处为可选点)。
\G
用于强制所有结果连续到第一个管道。由于没有匹配模式中的管道,因此连续性被破坏,第二个分支[^|]+
用于其他项目。
注意:以同样的方式,您可以选择使用此模式确保字符串第二部分的连续性:\|\K[^|]+|[^|.]+
(如果字符串的第二部分包含很多内容,这可能会很有趣项目)。但是这次不需要使用\G
锚点,因为每个连续的项目前面都有一个管道。
注意2:如果您想记入空项目,可以将模式更改为:
regex.findall(r'\G(?:\A|\.)\K[^.|]*|[^|]+|(?<=\|)', s)
或
regex.findall(r'\|\K[^|]*|(?:\.|\A)\K[^|.]*', s)
答案 1 :(得分:0)
使用re
模块。使用re.split
应该可以做到这一点,例如re.split('[|.]', string)