python:conditinoally拆分字符串

时间:2011-11-06 16:15:01

标签: python

有很多关于python拆分的问题,但我找不到 对应我的问题。我想拆分一个字符串,但需要 分离器的不同值,具体取决于条件。为了测试 case,我的字符串是“11xx22xx33xxBEGINxx44xx55xxENDxx66xx77”。我想要 以块的形式处理这个字符串,这意味着我想逐步完成它 这样:

拆分'11',用它做点什么

分开'22',用它做点什么

分开'33',用它做点什么

拆分'BEGINxx44xx55xxEND',用它做点什么

拆分'66',用它做点什么

分开'77',用它做点什么

我尝试了一个递归函数:

import string

mystring = "11xx22xx33xxBEGINxx44xx55xxENDxx66xx77"

def makechunks(s):
    try: splitter
    except NameError:
        splitter = "xx"
    whole = s.split(splitter, 1)
    current = whole[0]
    try: whole[1]
    except NameError:
        return
    else:
        rest = whole[1]
        if current.find("BEGIN", 0, 5):
            splitter = "END"
        else:
            splitter = "xx"
        makechunks(rest)
        print("AA", current, "BB")

makechunks(mystring)

但我收到的错误是“列表索引超出范围”。也许是我的全部 方法是有缺陷的,有更好的方法来实现我想要的?生病 感谢任何提示。

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用正则表达式执行此操作:

matches = re.findall('(?:^|xx)(BEGIN.*?END|.*?)(?=xx|$)', s)

结果:

['11', '22', '33', 'BEGINxx44xx55xxEND', '66', '77']

查看在线工作:ideone

答案 1 :(得分:1)

如何分割它们然后加入BEGIN和END之间的所有内容?

ssplit = mystring.split("xx")
bIndex = ssplit.index("BEGIN")
eIndex = ssplit.index("END")
bend = "xx".join(ssplit[bIndex:eIndex+1])
others = ssplit[:bIndex] + ssplit[eIndex+1:]

现在你在'弯曲'中有你的BEGIN..END标记,在'其他'中有剩余的标记