【发布时间】:2016-02-15 01:15:58
【问题描述】:
如何在不创建两个列表和附加的情况下拆分这个多重分隔符,这似乎是非常影响性能的操作。
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']
【问题讨论】:
-
尝试this demo - 不知道是否反转字符串并使用普通的
re模块会加快速度,但它是regex模块的另一种替代方案。 -
@stribizhev 谢谢我试过,即使这很慢。我实际上每天解析 20 M 条记录的日志。这只是玩具数据,实际上有 35 到 62 列拆分
-
我明白了。很可惜Python
re不支持\G。 -
@stribizhev:我只是意识到没有必要
\G锚...哎呀。 -
@CasimiretHippolyte:我知道它可以通过可变宽度的后视来完成。同样,除了 .NET 之外,我在任何地方都想念一些东西(好吧,不是在谈论基于 ICU 的正则表达式引擎的受限宽度后视)。
标签: python regex python-2.7 parsing