Регулярные выражения Python - PullRequest
1 голос
/ 31 марта 2019

Я занимался повторным модулем и столкнулся с интересной проблемой.

Я легко могу заменить два слова:

re.sub("30 apples", r"apples 30", 'Look 30 apples.') # 'Look apples 30.'

Но я хочу поменять два слова, только если перед яблоками стоит 30.

Как это сделать?

Я попробовал посмотреть за методом:
re.sub('(?<=\d\d) apples', r'\2 \1', 'Look 30 apples.')

Но для этого не нужны группы \ 1 и \ 2.

1 Ответ

2 голосов
/ 31 марта 2019

Когда вы используете шаблон (?<=\d\d) apples, совпадение начинается сразу после 2 цифр и становится пробелом плюс apples.Если вы попытаетесь поменять местами два значения, вам нужно потреблять обоих, и, как вы видите, lookbehind не потребляет текст.

Таким образом, вам нужно использовать группы захвата здесь, вшаблон и замените его на соответствующие обратные ссылки:

result = re.sub(r"(\d+)(\s+)(apples)", r"\3\2\1", 'Look 30 apples.')

См. демонстрационную версию regex . Регулексный график :

enter image description here

Подробности

  • (\d+) -Группа захвата 1 (\1 в шаблоне замены): одна или несколько цифр
  • (\s+) - Группа захвата 2 (\2 в шаблоне замены): один или несколько пробелов
  • (apples) - Группа захвата 3 (\3 в шаблоне замены): apples.

Демо Python :

import re
result = re.sub(r"(\d+)(\s+)(apples)", r"\3\2\1", "Look 30 apples.")
print(result)
...