2016-12-26 3 views
2

У меня есть строка:питон повторно регулярное выражение

A = '\r\nGigabitEthernet1/0/26 unassigned  YES unset down     down \r\nGigabitEthernet1/0/27 unassigned  YES unset down     down \r\nGigabitEthernet1/0/28 unassigned  YES unset down     down \r\nSW-P-24#          ' 

Мои регулярные выражения

r'\\r?\\n?.{0,100}\s{0,40}$' 

Моя цель состоит в том, чтобы заменить '\r\nSW-P-24# ' с '\\r\\n'

поэтому мой код

re.sub(r'\s*\\r?\\n?.{0,100}\s{0,40}$', '\\r\\n', A) 

Моя ожидать возвращение

'\r\nGigabitEthernet1/0/26 unassigned  YES unset down     down \r\nGigabitEthernet1/0/27 unassigned  YES unset down     down \r\nGigabitEthernet1/0/28 unassigned  YES unset down     down \r\n' 

но Python возвращает:

'\r\nGigabitEthernet1/0/26 unassigned  YES unset down     down \r\nGigabitEthernet1/0/27 unassigned  YES unset down     down \r\nGigabitEthernet1/0/28 unassigned  YES unset down     down \r\nSW-P-24#          ' 

Что такое правильный код?

ответ

0

Проблема лежат вокруг \\r?\\n?

Во-первых, необработанный префикс не требует двойной косой черты, а затем флаг «0 или 1» смущает механизм регулярных выражений.

Использование назад поиск на группе CR + LF, кажется, работает (и что трюк позволяет заменить пустую строку вместо того, чтобы повторять строки CR + LF):

re.sub(r'(?<=\r\n).{0,100}\s{0,40}$', '', A) 

однако, я не уверен, что вы не хотите, чтобы просто удалить последнюю строку, в этом случае, не регулярное выражение не требуется:

"\r\n".join(A.split("\r\n")[:-1]) 
+0

спасибо большое ... – tiw

0

Это работает для меня:

B = re.sub( r'\r\n\S+\s+$', r'\r\n', A ) 

Главное, чтобы исправить то, что вы должны либо использовать забортной строку r'...', или вы удвоиться каждый обратный слэш '\\' бут не делайте обе эти вещи вместе.

Я выбрал соответствующий шаблон после последнего CRLF как \S+, что означает «один или несколько символов без пробелов», за которым следует \s+, что означает «один или несколько пробельных символов». Ваш подход .{0,100}\s{0,40} может работать, хотя интерпретация и отладка немного запутаны, потому что .также соответствует белому пространству. У меня есть ощущение, что вам, возможно, нужно быть более конкретным, чем любой из этих подходов, однако, это зависит от того, какие другие примеры вам нужны, и что такое правило на самом деле. Знаки ?, которые вы попытались разместить после \r и \n, подскажите мне, что есть еще что вы нам не говорите. (Целевая линия удаляемого и CRLF, который предшествует его, не может быть там вообще, например? Если это так, то необходимо будет переделано в дальнейшем.)

+0

большое спасибо ... – tiw

0

Это регулярное выражение будет решить вашу проблему

re.sub('\s*.{0,100}\s{0,40}$', 'viki', A) 

Вопросы с вашим регулярным выражением:

\\r? ищет \\, а затем r не является обязательным.Это не то, что вы ищете. То же самое относится к \\n?

Причина, по которой предлагаемое мной регулярное выражение работает, потому что ваш. {0,100} уже потребляет \r\n в виде 4 разных значений символов.

+0

спасибо большое ... – tiw

Смежные вопросы