2017-02-08 3 views
0

re.sub('a(b)','d','abc')dc, а не adc. Так почему же re.sub понять группу захвата здесь?Re.sub с группой захвата

+0

Вы не используете его в замене, так что же вы ожидаете? Если вы хотите заменить «b», которому предшествует «a», вам нужно либо «re.sub (« ab »,« ad »,« abc ») или« re.sub ('(a) b », r '\ 1d', 'abc') ', где' '\ 1" 'относится к группе захвата. – DyZ

+0

Спасибо! Ожидается, что группа захвата будет заменена по умолчанию. Правильный подход выглядит менее интуитивно понятным, но, вероятно, более гибким. – Nick

ответ

2

Потому что он должен заменить все вхождения шаблона:

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

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

  1. Указать образец целиком: re.sub('ab', 'ad', 'abc') - мой любимый, так как он очень читабельен и ясен.
  2. Захват группы, которые вы хотите сохранить и затем ссылаться на них в шаблоне (обратите внимание, что это должно быть сырым строка, чтобы избежать побега): re.sub('(a)b', r'\1d', 'abc')
  3. Аналогично предыдущему варианту: обеспечивают функцию обратного вызова в качестве repl аргумента и заставить обработать объект Match и вернуть требуемый результат.
  4. Используйте lookbehinds/lookaehs, которые не входят в игру, но влияют на соответствие: re.sub('(?<=a)b', r'd', 'abxb') дает adxb. ?<= в начале группы говорит: «Это взгляд».
+1

Просто быстрый совет: вы можете использовать '\ 1' ** в regex **:' re.match (r '([la] {2}) - \ 1', 'la-la') '. Это будет соответствовать тому, что группировать ссылку ('1' в этой обложке) ** соответствует ** (не шаблон), поэтому это регулярное выражение не будет соответствовать« la-al », например. – math2001

Смежные вопросы