4

私は正規表現に不慣れで、re.split機能に問題があります。

私の場合、分割は「特別なエスケープ」を気にする必要があります。

;先頭に。がある場合を除いて、テキストはで区切る必要があります?

編集:その場合、2つの部分を分割してはならず、?を削除する必要があります。

ここに例と私が望む結果があります:

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でその動作を再現する「高速」な方法はありますか?

re.findall関数が解決策になるでしょうか?

たとえば、このコードの拡張バージョンは次のとおりです。

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

私はPython2.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

1つの正規表現ではやりたいことができません。分割?;後にエスケープを解除することは、まったく別のタスク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 に答える
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 に答える