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),但我会让你把它加起来,以避免改变已经复杂的表达式的可见性.
使用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)
您只能在列表理解中使用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实现.此模块中的扫描仪也将注释作为标记返回,这使得它可用于实现"漂亮的打印机",包括用于屏幕显示的着色器.