Python - 正确提取拆分列表

时间:2017-02-19 22:50:59

标签: python list split expression

作为this question的后续版,我有一个表达式:['(', '44', '+(', '3', '+', 'll', '))']是使用re.findall('\w+|\W+',item)方法创建的,但是在此字符串列表中,有两个错误。一个是' +('另一个是'))'。

是否有一种pythonic方式,我可以只拆分运算符,使列表类似于['(', '44', '+','(', '3', '+', 'll', ')',')']

(将数字/字母保持在一起,将符号分开)

由于

4 个答案:

答案 0 :(得分:1)

您想要分组分组的非字母数字字符。

如果项目是ok(字母数字),我会创建一个列表项目,如果项目是一系列符号,我会创建一个字符列表。

然后,我将列表展平以获得您要求的内容

import itertools

l = ['(', '44', '+(', '3', '+', 'll', '))']
new_l = list(itertools.chain.from_iterable([x] if x.isalnum() else list(x) for x in l))
print(new_l)

结果:

['(', '44', '+', '(', '3', '+', 'll', ')', ')']

编辑:实际上你可以通过不在正则表达式中对符号进行分组来将你的2个问题链接到一个答案(调整原始问题的regex answer):

import re
lst = ['z+2-44', '4+55+((z+88))']
print([re.findall('\w+|\W', s) for s in lst])

(请注意+之后缺少\W)并直接获得:

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

答案 1 :(得分:1)

使用str.join()re.split()函数的简短解决方案:

import re
l = ['(', '44', '+(', '3', '+', 'll', '))']
new_list = [i for i in re.split(r'(\d+|[a-z]+|[^\w])', ''.join(l)) if i.strip()]

print(new_list)

输出:

['(', '44', '+', '(', '3', '+', 'll', ')', ')']

答案 2 :(得分:1)

另一种方法是更改​​正则表达式,以便将非字母数字字符分开:

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

答案 3 :(得分:1)

试试这个:

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

可能对其他人有帮助。