как захватить все группы регулярных выражений, кроме последней? - PullRequest
0 голосов
/ 13 февраля 2019

Как преобразовать текст camelCase в верхний регистр подчеркивания, но удалить суффикс?

Если у меня есть текст «AbcdEfghIjklAlphabet», как я могу его перехватить, чтобы в результате получился «ABCD_EFGH_IJKL» с суффиксом Alphabetушел?

Можно ли сделать это с помощью регулярных выражений?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Решение простое и может быть выполнено полностью в регулярном выражении без зацикливания, если вы используете язык с надежным механизмом регулярных выражений, таким как Python.

Pattern: ([A-Z][a-z]*(?![a-z]*$))

Replace: \U\1_

Объяснение:

  • [A-Z][a-z]* - соответствует заглавной букве, за которой следует любое количество строчных букв.

  • (?![a-z]*$) - Утвердите, что за символами, соответствующими вышеприведенному шаблону, не следует ни одно количество строчных букв, а затем конец строки, чтобы предотвратить сопоставление последней группы.

  • (...) - весь шаблон заключен в круглые скобки, чтобы совпадение было записано на более поздний срок.

  • (замена) \U - преобразовать следующий вывод в верхний регистр.

  • (Замена) \1 - Вывести значение первой группы захвата.

0 голосов
/ 13 февраля 2019

Вам нужно будет «закрепить» заднюю часть вашей цели.Вероятным кандидатом для этого является утверждение «границы слова» нулевой ширины: \b

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

pattern = r'(capture-stuff-at-the-front)But-no-stuff-at-the-end\b'

Теперь вы захватываете все, кроме последнего слова или чего-то еще.Вы просто должны решить, что является предварительным материалом, и каковы различные крайние случаи.Итак:

  1. Если первая буква в нижнем регистре, например: isCondition Вы хотите, чтобы это совпадало?

  2. Если есть толькоодно слово, например: Heavy это совпадение?

  3. Разрешены ли цифры, и если да, то должны: Rs232Cable сохранять числа спереди или сзади?

  4. и так далее.Я уверен, что есть вещи, о которых я не думал ...

Так что попробуйте это:

pattern = r'((?: uppercase-letter lowercase-letters*)+uppercase-letter lowercase-letters+\b'

Это может соответствовать PRPolicy, а также RequestPolicy и захватить все, кроме последнего Policy.

import re
test = 'isCondition Heavy Rs232Cable PRPolicy RequestPolicy'
pattern = r'((?:[A-Z][a-z]*)+)[A-Z][a-z]+\b'

for m in re.findall(pattern, test):
    print(m)

Вывод:

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