2013-04-16 2 views
0

В Python У меня есть следующая строка:питон регулярное выражение строки разделить

|a|b\|c|d| 

Я хочу, чтобы разделить строку:

a 
b\c 
d 

В принципе, я должен разделить с '|' Ограничитель, но нужно заботиться обратный слэш специально

+0

Я новичок в регулярном выражении. Попробовали несколько: re.split ('. *! \\ |. *! \ |', X) – wantro

+2

Просто для подтверждения: обратная косая черта означает «игнорировать следующий разделитель»? Это немного необычно - обычно это означает нечто большее, чем «следующий символ не используется в качестве разделителя», и вам нужно «a», «b | c',' d'. – DSM

+2

@DSM, это должна быть опечатка. S/он, вероятно, означает 'b | c', а не' b \ c'. – alexis

ответ

3

Если вы хотите использовать регулярные выражения вам нужно отрицательное утверждение с просмотром назад.

import re 
data = '|a|b\|c|d|' 
matches = re.split(r'(?<!\\)\|', data) 

Нам нужно избежать особых символов. \| соответствует одному |. (?<!\\) обеспечивает обратную косую черту перед |.

Теперь у нас есть ведущая и конечная пустая строка в списке. Давайте используем фильтр для их удаления.

filter(bool, matches) 
8

Там нет необходимости в регулярных выражениях:

>>> s = '|a|b\\|c|d|' 
>>> s.replace('\\|', '\\').strip('|').split('|') 
['a', 'b\\c', 'd'] 
+0

Спасибо. Я знаю, что он не нуждается в регулярном выражении. Но это было больше для целей обучения. – wantro

1

Неясно мне, если вы имели в виду b|c быть результатом побега b\|c и у вас есть опечатка? В результате вы получаете нестандартное значение, так как \ обычно используется для устранения расщепления и сохранения следующего разделителя.

Предположим, что в большинстве случаев вы предпочитаете более обычный b|c.

Для регулярного выражения решения (для b\c в данном случае) это работает:

>>> [e for e in re.split(r'\|',s.replace('\|','\\')) if e] 
['a', 'b\\c', 'd'] 

Я использовал Python заменить для '\ |' а не регулярное выражение, потому что это делает регулярное выражение намного легче понять.

Если вы хотите (то, что я думаю, что более привычно) b|c просто добавить его обратно:

>>> [e.replace('\\','|') for e in re.split(r'\|',s.replace('\|','\\')) if e] 
['a', 'b|c', 'd'] 

Или, вы можете использовать csv:

import StringIO 
import csv 

s='|a|b\|c|d|' 

f = StringIO.StringIO(s) 
reader = csv.reader(f, delimiter='|', escapechar='\\') 

for row in reader: 
    print filter(bool,row) 

Печать:

['a', 'b|c', 'd'] 
Смежные вопросы