如何根据输入参数创建一个可以将字符串拆分任意次数的函数?

时间:2014-11-29 20:17:52

标签: python string function split

我正在尝试创建一个将字符串拆分为项目然后将这些项目进一步拆分为子项目的函数,并持续执行此操作,直到它耗尽参数。

例如,我想首先用逗号分割以下字符串,然后按行分割,然后用感叹号分割,然后用字母b分割。这是四个分裂。

s = 'abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!'

使用以下内容我可以得到所需的结果:

split1 = s.split(',')
split2 = map(lambda i:i.split("|"),split1)
split3 = map(lambda i: map(lambda subitem: subitem.split("!"),i),split2)
split4 = map(lambda i: map(lambda subitem: map(lambda subsubitem: subsubitem.split("b") ,subitem),i),split3)

结果:

[[[['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['']]]]

但是,我想编写一个可以执行整个过程并接受任意数量参数的函数。换句话说,该功能可以执行上述过程,但仅针对感叹号和线进行拆分或拆分任意数量的项目。

如何创建一个执行上述过程但看起来像这样的函数?

func(s,*args)

以便它可以执行以下操作来完成与上面相同的结果。

func(s,",","|","!","b")

2 个答案:

答案 0 :(得分:3)

from string import split
def rec_split(s, *tokens):
    if tokens == ():
        return s
    else:
      return map(lambda x: rec_split(x, *tokens[1:]), split(s, tokens[0]))

对我来说,这给了:

In [669]: s = (
    'abcde,abcde|abcde!abcde,abcde|abcde!'
    'abcde,abcde|abcde!abcde,abcde|abcde!'
    'abcde,abcde|abcde!abcde,abcde|abcde!'
    'abcde,abcde|abcde!abcde,abcde|abcde!'
)

In [670]: rec_split(s, ",", "|", "!", "b")
Out[670]: 
[[[['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['']]]]

答案 1 :(得分:1)

基本上和@ prpl.mnky.dshwshr一样,但是简化了:

>>> s = ('abcde,abcde|abcde!abcde,abcde|abcde!abcde,abcde|'
...      'abcde!abcde,abcde|abcde!abcde,abcde|abcde!abcde,'
...      'abcde|abcde!abcde,abcde|abcde!abcde,abcde|abcde!')
>>> 
>>> def func(s, *args):
...     return [func(s, *args[1:]) for s in s.split(args[0])] if args else s
... 
>>> import pprint
>>> 
>>> pprint.pprint(func(s, ',', '|', '!', 'b'))
[[[['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['a', 'cde']]],
 [[['a', 'cde']], [['a', 'cde'], ['']]]]