2014-11-29 2 views
-2

Мне нужно заменить часть строки и на нее набрать re_sub.Регулярное выражение Python для замены в строке

import re 
line = "-p ${config.tab} -sp" 
rep = re.sub('-p(.*?)-sp', 'sam', line) 

Я ожидал, что результат будет: -

-p sam -sp 

Но его полная замена Сэмом и дает: -

sam 

Любая помощь Спасибо

+2

у вас есть опечатка 'line.sub' должен быть' re.sub', вам нужно использовать внешний вид! – Kasramvd

+0

Хорошо пятнистый @ Kasra. Я изменил это, но дал мне тот же результат. Я думаю, что мое регулярное выражение ошибочно – sam

+0

посмотреть http://www.regular-expressions.info/lookaround.html! – Kasramvd

ответ

3

Проблема с -p(.*?)-sp

-p и -sp в начале и в конце потребляется двигателем регулярных выражений. И re.sub repalces всей строки, совпавшая с регулярным выражением

То есть http://regex101.com/r/oH3lV9/1

Решения

Вы можете использовать внешний вид обходные

>>> rep = re.sub('(?<=-p)(.*?)(?= -sp)', 'sam', line) 
>>> rep 
'-p sam -sp' 
  • (?<=-p) утверждает, что строка presceded по -p, но не потреблял его просто проверить, если он prescedes только

  • (?= -sp) утверждает, что строка следует -sp

Чувствуете разницу http://regex101.com/r/oH3lV9/2

+0

Спасибо @ nu11p01n73R :) – sam

+0

@sam Добро пожаловать :) Рад, что я могу помочь – nu11p01n73R

0

Использование capturing groups для захватив символы, в которые вы хотите ссылаться позже, и вам необходимо определить ваш шаблон как необработанный stri нг.

>>> line = "-p ${config.tab} -sp" 
>>> print(re.sub(r'(-p\s)(.*?)(\s-sp)', r"\1sam\3", line)) 
-p sam -sp 
>>> print(re.sub(r'(-p\s).*?(\s-sp)', r"\1sam\2", line)) 
-p sam -sp 

DEMO

Объяснение:

  • (-p\s+) Захватывает -p и следующие один или несколько символов пробела.
  • .*? Нежелательное совпадение любого символа в ноль или более раз.
  • (\s+-sp) захватывает один или несколько пробелов и следующих -sp
  • Замена всех совпавшие символы с символами внутри индекса группы 1 плюс строка sam плюс символы внутри индекса группы 2 даст вам желаемый результат.
Смежные вопросы