4

我是正则表达式的新手,并且对 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

4 回答 4

5

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

>>> txt = 'abc;vwx?;yz;123'
>>> r = csv.reader([txt], delimiter=';', escapechar='?')
>>> next(r)
['abc', 'vwx;yz', '123']
于 2013-03-22T17:03:33.827 回答
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']
于 2013-03-25T18:14:35.727 回答
0

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

只需将任务分开即可;您可以使用生成器为您进行转义:

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

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

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

于 2013-03-22T16:54:29.637 回答
0

我会这样做:

 re.sub('(?<!\?);',r'|', txt).replace('?;',';').split('|')
于 2013-03-22T17:06:59.000 回答