如何正确拆分这个字符串列表?

13 python regex string split list

我有一个字符串列表,如下所示:

['z+2-44', '4+55+z+88']
Run Code Online (Sandbox Code Playgroud)

如何在列表中拆分此字符串,使其类似于

[['z','+','2','-','44'],['4','+','55','+','z','+','88']]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用该split方法然而将44分为4和4,我不知道还有什么可以尝试.

Psi*_*dom 26

你可以使用正则表达式:

import re
lst = ['z+2-44', '4+55+z+88']
[re.findall('\w+|\W+', s) for s in lst]
# [['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Run Code Online (Sandbox Code Playgroud)

\w+|\W+匹配由单词字符(在您的情况下为字母数字值)或非单词字符(+-在您的情况下为符号)组成的模式.


Jea*_*bre 14

这将起作用,使用 itertools.groupby

z = ['z+2-44', '4+55+z+88']

print([["".join(x) for k,x in itertools.groupby(i,str.isalnum)] for i in z])
Run Code Online (Sandbox Code Playgroud)

输出:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Run Code Online (Sandbox Code Playgroud)

它只是将字符分组,如果它们是字母数字(或不是),只需将它们加入列表理解中即可.

编辑:用括号计算器一般情况下,已被要求作为后续问题在这里.如果z如下:

z = ['z+2-44', '4+55+((z+88))']
Run Code Online (Sandbox Code Playgroud)

然后我们得到以前的分组:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+((', 'z', '+', '88', '))']]
Run Code Online (Sandbox Code Playgroud)

在令牌方面解析起来并不容易.因此,join只有在使用alphanum时才会进行更改,如果不是,则将其列为最终使用chain.from_iterable:

print([list(itertools.chain.from_iterable(["".join(x)] if k else x for k,x in itertools.groupby(i,str.isalnum))) for i in z])
Run Code Online (Sandbox Code Playgroud)

产量:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', '(', '(', 'z', '+', '88', ')', ')']]
Run Code Online (Sandbox Code Playgroud)

(请注意,备用正则表达式的答案也可以这样调整:( [re.findall('\w+|\W', s) for s in lst]注意缺少+W)

"".join(list(x))稍快"".join(x),但我会让你把它加起来,以避免改变已经复杂的表达式的可见性.


Rom*_*est 6

使用re.split函数的替代解决方案:

l = ['z+2-44', '4+55+z+88']
print([list(filter(None, re.split(r'(\w+)', i))) for i in l])
Run Code Online (Sandbox Code Playgroud)

输出:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 5

您只能在列表理解中使用str.replace()str.split()内置函数:

In [34]: lst = ['z+2-44', '4+55+z+88']

In [35]: [s.replace('+', ' + ').replace('-', ' - ').split() for s in lst]
Out[35]: [['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Run Code Online (Sandbox Code Playgroud)

但请注意,对于较长的字符串,这不是一种有效的方法.在这种情况下,最好的方法是使用正则表达式.

作为另一种pythonic方式,您还可以使用tokenize模块:

In [56]: from io import StringIO

In [57]: import tokenize

In [59]: [[t.string for t in tokenize.generate_tokens(StringIO(i).readline)][:-1] for i in lst]
Out[59]: [['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Run Code Online (Sandbox Code Playgroud)

所述记号化模块提供Python源代码词法扫描器,用Python实现.此模块中的扫描仪也将注释作为标记返回,这使得它可用于实现"漂亮的打印机",包括用于屏幕显示的着色器.


归档时间:

查看次数:

2324 次

最近记录:

8 年,7 月 前