Проблема с вашим регулярным выражением в том, что [^|]*
соответствует символам новой строки. Поэтому, если бы текст был
My dog
has | fleas
, ваше регулярное выражение ^([^|]*).
вернуло бы
My dog
has |
, а группа захвата 1 содержала бы
My dog
has
. легко исправить, сопоставив любой символ, кроме символа или символа новой строки (или возврата каретки):
[^|\r\n]*
Однако это будет успешно выполнено, если строка не содержит каналов, что не то, что мы хотим. Поэтому мы должны оговорить, что символ, следующий за совпадением, является каналом. Есть два способа сделать это. Первый - создать группу захвата, которая будет содержать желаемое совпадение, как вы сделали:
([^|\r\n]*)\|
Для приведенного выше примера это будет соответствовать
has |
, и группа захвата 1 будет содержать has
(включая пробел после s
).
Второй способ, который устраняет необходимость в группе захвата, заключается в использовании положительного взгляда :
^[^|\r\n]*(?=\|)
или на Pythonese,
r'^[^|\r\n]*(?=\|)'
Demo
Регулярное выражение гласит: «соответствует началу строки, за которым следует ноль большего числа символов, не являются ни трубами, ни возвратом каретки, ни переводом строки, за которыми сразу следует труба ".
Если вы хотите sh удалить первую трубу, а также все предшествующие ей, вам не нужен позитивный прогноз :
r'^[^|\r\n]*\|'
Другой способ, который я предложил в комментарии, заключается в использовании:
r'^.+?(?=\|)'
Это использует тот факт, что .
не соответствует символам новой строки и .+?
не жадный, поэтому он прекратит потребление символов, как только nex т характер это труба.