python - 使用分隔符 1 和索引 [0] 与其他分隔字符串

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

最佳答案

新答案:

使用 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 anchor ,因为每个连续项前面都有一个管道。

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

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

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

关于python - 使用分隔符 1 和索引 [0] 与其他分隔字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693049/

相关文章:

python - 在 except block 中引发异常并抑制第一个错误

识别多个类的 CSS 速记

javascript REGex 删除匹配中的单引号

python - 磁盘寻道时间测量方法

python - Django:覆盖子模型中的字段标签或帮助文本

python - 如何使用初始值递归地将参数输入到此函数中?

python - 词典词典: Sorting by a specific key

python - 为什么二级字典的值在 Python 2.7 中都指向同一个对象?

python - 按 'escape' 时离开 kivy 应用程序

javascript - ng-pattern 允许单词之间有空格