Вам нужно будет «закрепить» заднюю часть вашей цели.Вероятным кандидатом для этого является утверждение «границы слова» нулевой ширины: \b
Как только вы узнаете, где находится конец совпадения, вставьте жесткое требование для любого шаблона в конце и не захватывайте это .Примерно так:
pattern = r'(capture-stuff-at-the-front)But-no-stuff-at-the-end\b'
Теперь вы захватываете все, кроме последнего слова или чего-то еще.Вы просто должны решить, что является предварительным материалом, и каковы различные крайние случаи.Итак:
Если первая буква в нижнем регистре, например: isCondition
Вы хотите, чтобы это совпадало?
Если есть толькоодно слово, например: Heavy
это совпадение?
Разрешены ли цифры, и если да, то должны: Rs232Cable
сохранять числа спереди или сзади?
и так далее.Я уверен, что есть вещи, о которых я не думал ...
Так что попробуйте это:
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