2014-09-03 3 views
0

Я пытаюсь понять, что не так с моим регулярным выражением python.Python regex проглатывает один символ в новой строке подстановки

Задача: У меня есть следующий текст.

This is a red fox\LF 
that chases a cat.\LF 
\LF 
The dog barks. 

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

This is a red fox that chases a cat.\LF 
The dog barks. 

Решение: я просто придумал простой

re.sub(r'(\n)[^\n]', '', text) 

проблемы : Однако я получаю это на самом деле:

This is a red foxhat chases a cat. 
he dog barks. 

Я был уверен, что замена должна заменить только сгруппированные (\n). Какое правильное регулярное выражение для этой задачи?

ответ

1

Вы потребляя t и T, потому что ваш шаблон совпадает с символом новой строки и immeditely следующего символа.

Вы можете использовать группу захвата, чтобы помнить, что такое символ, и вставить его обратно в строку.

re.sub(r'\n([^\n])', r'\1', text) 
1

Вы можете использовать это регулярное выражение:

(?<!\.)\\LF\W+ 

Working demo

enter image description here

Вы также можете использовать:

(?<!\.)\\LF$ 

но вы получите другой результат, как вы указано.

+0

это должно быть менее сложным, чем при использовании «Отрицательная просмотра назад», но спасибо. – minerals

+0

@minerals Я понимаю, что синтаксис может быть уродливым, но если вы посмотрите на него по частям, это означает: «Матч \ LF, если он не имеет точки раньше». –

1

В основном то, что вы говорите сейчас, чтобы искать любой новой строки, за которым следует, не символ новой строки и заменить оба символа пустой строкой.

Но если вы не включаете этот второй символ, который соответствует любой новой строке в вашей строке, и это не то, что вы хотите.

Чтобы иметь строгое регулярное выражение, но не заменять все, что вам нужно, вы должны использовать группы захвата. (...) В регулярном выражении что-то между скобками фиксируется и сохраняется.

Когда вы делаете свою замену, вы можете получить доступ к этим сохраненным группам, используя \index. Так \1 для захваченной первой группы \2 для второго и т.д.

Для вашей проблемы вы могли бы использовать регулярное выражение, которое соответствует любой новой строке, которая не предшествуют точкой. ([^\.])\n. Конечно, если этот предшествующий персонаж не является точкой, которую вы хотите сохранить.Таким образом, вы его захватили. И положить его обратно в замещении, как так:

re.sub(r'([^\.])\n', '\1 ', text) 

Example on regex101

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