python - 使用许多分隔符分隔字符串(列表元素),而不会丢失列表中的碎片

标签 python parsing python-2.7 split

如果列表元素包含任何值,我想分隔列表元素

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

最佳答案

您可以使用 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

关于python - 使用许多分隔符分隔字符串(列表元素),而不会丢失列表中的碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518759/

相关文章:

python - Pandas 通过其他列的数量来填充列

python - Orator ORM模型创建方法无效SQL

perl - 从 Perl 文本 block 中提取一个人的全名?

asp.net - 通过 ASP.NET 在 Web 上对 Word 文档进行富文本编辑

python - 在另一个类函数中使用一个类的条目

python - 在 Python 中,自定义文件描述符如何用于输入和输出,包括默认设置和最终关闭?

python - django.db.utils.OperationalError : (1426,“精度太大1000

python - Julia 中一维随机游走的直方图

python - 在python中使用基类classmethod实例化派生类对象

php - 如何在 explode 和正则表达式之间进行选择