удалите все до первой трубы с помощью регулярных выражений - PullRequest
0 голосов
/ 02 мая 2020

Я хочу удалить все перед первым каналом в этих строках.

https://www.reddit.com/r/regex/comments/2s1epf/help_remove_after_nth_occurrence/ | Help |remove after nth occurrence : regex
https://superuser.com/questions/626194/how-to-use-codefolding-feature-of-notepad-for-normal-text-documents | windows 7 - how to use codefolding |feature of notepad++ for normal text documents - Super User
https://superuser.com/questions/14946/is-there-a-simple-automated-way-to-convert-a-large-number-of-files-between-zip?rq=1 | windows - Is there a simple, automated way to convert a large number of files between ZIP and RAR formats? - Super User
https://stackoverflow.com/questions/20298682/suppress-error-messages-in-windows-commandline | shell - Suppress error messages in Windows commandline -| Stack Overflow

Я пытался

^([^|]*).

, но он удаляет все пустые строки и другие строки и все остальные строки без трубы

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Проблема с вашим регулярным выражением в том, что [^|]* соответствует символам новой строки. Поэтому, если бы текст был

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 т характер это труба.

0 голосов
/ 02 мая 2020

Это на самом деле происходит потому, что вы не «прекращаете» сопоставление с регулярным выражением - точка в конце вашего шаблона будет продолжать совпадать, что будет включать следующие строки, которые не имеют каналов или являются пустыми.

Один шаблон регулярных выражений, который вы можете использовать (если ваш вариант регулярных выражений позволяет искать в очереди), например:

^.+\s(?=\|\s)

Объяснение:

^         # line start
.+\s      # match all characters between 1 and unlimited amount and a space
(?=\|\s)  # GIVEN that the following pattern exists |+whitespace. This is not part of your final match. 

Поэтому в этом случае сопоставление будет прекращено, как только как первый _|_ образец обнаружен. Если ваш вкус регулярных выражений не позволяет смотреть вперед, просто поместите первую часть регулярного выражения в группу и используйте это:

(^.+\s)\|\s

Вот вам демо , с которым вы можете поиграть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...