Как я могу опустить слова в середине регулярного выражения в Python? - PullRequest
0 голосов
/ 18 сентября 2009

У меня есть многострочная строка, подобная этой:

"...Togo...Togo...Togo...ACTIVE..."

Я хочу получить все между третьим «Того» и «АКТИВНЫМ» и остатком строки. Я не могу создать регулярное выражение, которое может сделать это. Если я попробую что-то вроде

reg = "(Togo^[Togo]*?)(ACTIVE.*)"

ничего не записывается (для захвата групп нужны первые и последние скобки).

Ответы [ 3 ]

1 голос
/ 18 сентября 2009

Это соответствует только желаемым частям:

.*(Togo.*?)(ACTIVE.*)

Ведущий .* является жадным, поэтому следующие Togo соответствуют последнему возможному месту. Захваченная часть начинается с последнего Togo.

В вашем выражении ^[Togo]*? не делает правильных вещей. ^ пытается соответствовать началу строки, а [Togo] соответствует любому из символов T, o или g. Даже [^Togo] не сработает, так как это соответствует любому символу, который не T, o или g.

1 голос
/ 20 сентября 2009
"(Togo(?:(?!Togo).)*)(ACTIVE.*)"

Квадратные скобки в вашем регулярном выражении образуют класс символов, который соответствует одному из символов 'T', 'o' или 'g'. Символ каретки ('^') соответствует началу ввода, если он не входит в класс символов, и его можно использовать в квадратных скобках для инвертирования класса символов.

В моем регулярном выражении после сопоставления слову "Того" я сопоставляю по одному символу за раз, но только после того, как проверяю, что это не начало другого экземпляра "Того" (?!Togo) называется негативным прогнозом .

1 голос
/ 18 сентября 2009
reg = "Togo.*Togo.*Togo(.*)ACTIVE"

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

reg = "Togo(([^T]|T[^o]|To[^g]|Tog[^o])*T?.?.?)ACTIVE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...