使用多个拆分器分隔字符串(列表元素)而不会丢失列表中的拆分器

时间:2014-10-22 23:16:26

标签: python parsing python-2.7 split

如果list元素包含

中的任何值,我想分隔列表元素
list_operators = ['+', '-', '*', '(', ')']

不会从列表中丢失运算符而不使用正则表达式。

例如:

my_list = ['a', '=', 'x+y*z', '//', 'moo']

通缉输出:

['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo']

和x y z是不是一个字符的单词:

['john+doe/12*5']

['john','+','doe','/','12','*','5']

3 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupby()来实现此目标:

from itertools import groupby

operators = {'+', '-', '*', '(', ')'}
fragments = ['a', '=', 'x+y*z', '//', 'moo', '-', 'spam*(eggs-ham)']
separated = []
for fragment in fragments:
    for is_operator, group in groupby(fragment, lambda c: c in operators):
        if is_operator:
            separated.extend(group)
        else:
            separated.append(''.join(group))
>>> separated
['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo', '-',
 'spam', '*', '(', 'eggs', '-', 'ham', ')']

请注意,我已将变量的名称更改为更有意义,并将operators设置为一组,因为我们只关心成员资格而非订单(尽管代码也可以正常工作,如果稍微慢一点,有一个清单)。

groupby()会返回(key, group)对的可迭代,每当key更改时都会启动一个新组。由于我选择了仅在lambda c: c in operators中测试角色成员身份的关键功能(operators),因此groupby()调用的结果如下所示:

[
    (False, ['s', 'p', 'a', 'm']),
    (True, ['*', '(']),
    (False, ['e', 'g', 'g', 's']),
    (True, ['-']),
    (False, ['h', 'a', 'm']),
    (True, [')'])
]

groupby()实际上返回由groupby object (key, grouper object元组组成的 ) - 为了清楚起见,我已将这些对象转换为上面示例中的列表。

其余代码很简单:如果is_operatorTrue,则group中的字符用于扩展separated;如果它是False,则group中的字符会重新连接回字符串并附加到separated

答案 1 :(得分:0)

这是一种简单的方法:

for x in my_list:
    if len(set(list_operators) & set(list(x)))!=0:
        for i in list(x):
            slist.append(i)
    else:
        slist.append(x)

slist
['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo']

答案 2 :(得分:0)

您也可以这样做:

import re
from itertools import chain

list_operators = ['+', '-', '*', '(', ')']
tokenizer = re.compile(r"[{}]|\w+".format("".join(map(re.escape, list_operators))))
my_list = ['a', '=', 'x+y*z', '//', 'moo', 'john+doe/12*5']
parsed = list(chain.from_iterable(map(tokenizer.findall, my_list)))

parsed结果:

['a', 'x', '+', 'y', '*', 'z', 'moo', 'john', '+', 'doe', '12', '*', '5']