В Python У меня есть следующая строка:питон регулярное выражение строки разделить
|a|b\|c|d|
Я хочу, чтобы разделить строку:
a
b\c
d
В принципе, я должен разделить с '|' Ограничитель, но нужно заботиться обратный слэш специально
В Python У меня есть следующая строка:питон регулярное выражение строки разделить
|a|b\|c|d|
Я хочу, чтобы разделить строку:
a
b\c
d
В принципе, я должен разделить с '|' Ограничитель, но нужно заботиться обратный слэш специально
Если вы хотите использовать регулярные выражения вам нужно отрицательное утверждение с просмотром назад.
import re
data = '|a|b\|c|d|'
matches = re.split(r'(?<!\\)\|', data)
Нам нужно избежать особых символов. \|
соответствует одному |
. (?<!\\)
обеспечивает обратную косую черту перед |
.
Теперь у нас есть ведущая и конечная пустая строка в списке. Давайте используем фильтр для их удаления.
filter(bool, matches)
Там нет необходимости в регулярных выражениях:
>>> s = '|a|b\\|c|d|'
>>> s.replace('\\|', '\\').strip('|').split('|')
['a', 'b\\c', 'd']
Спасибо. Я знаю, что он не нуждается в регулярном выражении. Но это было больше для целей обучения. – wantro
Неясно мне, если вы имели в виду 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']
Я новичок в регулярном выражении. Попробовали несколько: re.split ('. *! \\ |. *! \ |', X) – wantro
Просто для подтверждения: обратная косая черта означает «игнорировать следующий разделитель»? Это немного необычно - обычно это означает нечто большее, чем «следующий символ не используется в качестве разделителя», и вам нужно «a», «b | c',' d'. – DSM
@DSM, это должна быть опечатка. S/он, вероятно, означает 'b | c', а не' b \ c'. – alexis