使用分隔符1拆分字符串并使用其他索引[0]

时间:2015-11-13 12:44:33

标签: python regex python-2.7 parsing

如何在不创建两个列表和附加的情况下拆分这个多分隔符,这似乎是非常有性能的操作。

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

2 个答案:

答案 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']

demo

\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)