re.split()有特殊情况

时间:2013-03-22 16:33:34

标签: python regex

我是正则表达式的新手,并且在re.split功能方面存在问题。

在我的情况下,分裂必须关注“特殊逃脱”。

文字应该在;分隔,但有一个前导?

修改:在这种情况下,不应拆分这两部分,并且必须删除?

这是一个例子和我希望的结果:

import re
txt = 'abc;vwx?;yz;123'
re.split(r'magical pattern', txt)
['abc', 'vwx;yz', '123']

到目前为止,我尝试过这些尝试:

re.split(r'(?<!\?);', txt)

得到了:

['abc', 'vwx?;yz', '123']

遗憾地导致未消耗的?麻烦,以下列表理解对性能至关重要:

[part.replace('?;', ';') for part in re.split(r'(?<!\?);', txt)]
['abc', 'vwx;yz', '123']

有没有“快速”的方法来重现这种行为?

re.findall函数可以成为解决方案吗?

例如此代码的扩展版本:

re.findall(r'[^;]+', txt)

我正在使用python 2.7.3。

期待你的感谢!

4 个答案:

答案 0 :(得分:5)

正则表达式不是这项工作的工具。请改用csv模块:

>>> txt = 'abc;vwx?;yz;123'
>>> r = csv.reader([txt], delimiter=';', escapechar='?')
>>> next(r)
['abc', 'vwx;yz', '123']

答案 1 :(得分:0)

你不能用一个正则表达式做你想做的事。在拆分后取消?;是一项单独的任务,而不是在同时拆分时可以让re模块为您完成的任务。

将任务分开;你可以用一台发电机为你做无意义的事情:

def unescape(iterable):
    for item in iterable:
        yield item.replace('?;', ';')

for elem in unescape(re.split(r'(?<!\?);', txt)):
    print elem

但这不会比你的列表理解更快。

答案 2 :(得分:0)

我会这样做:

 re.sub('(?<!\?);',r'|', txt).replace('?;',';').split('|')

答案 3 :(得分:0)

试试这个: - )

def split( txt, sep, esc, escape_chars):
    ''' Split a string
        txt - string to split
        sep - separator, one character
        esc - escape character
        escape_chars - List of characters allowed to be escaped
    '''
    l = []
    tmp = []
    i = 0
    while i < len(txt):
        if len(txt) > i + 1 and txt[i] == esc and txt[i+1] in escape_chars:
            i += 1
            tmp.append(txt[i])
        elif txt[i] == sep:
            l.append("".join(tmp))
            tmp = []
        elif txt[i] == esc:
            print('Escape Error')
        else:
            tmp.append(txt[i])
        i += 1
    l.append("".join(tmp))
    return l

if __name__ == "__main__":
    txt = 'abc;vwx?;yz;123'
    print split(txt, ';', '?', [';','\\','?'])

返回:

['abc', 'vwx;yz', '123']