Замена начальных и конечных дефисов пробелами? - PullRequest
2 голосов
/ 28 августа 2009

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

Например, я хочу

--- абы --- с четкостью -

стать

000ab --- с-def00 (где нули - это пробелы)

Я пытаюсь сделать это в Python, но я не могу придумать регулярное выражение для замены Мне интересно, есть ли другой, лучший способ сделать это?

Ответы [ 3 ]

5 голосов
/ 28 августа 2009
re.sub(r'^-+|-+$', lambda m: ' '*len(m.group()), '---ab---c-def--')

Объяснение: шаблон соответствует 1 или более начальным или конечным тире; подстановка лучше всего выполняется вызываемым объектом, который получает каждый совпадающий объект - так что m.group () является соответствующей подстрокой - и возвращает строку, которая должна заменить его (столько пробелов, сколько было символов в указанной подстроке, в этом случай).

3 голосов
/ 28 августа 2009

Используйте вызываемый объект в качестве цели замещения:

s = re.sub("^(-+)", lambda m: " " * (m.end() - m.start()), s)
s = re.sub("(-+)$", lambda m: " " * (m.end() - m.start()), s)
0 голосов
/ 28 августа 2009

Всякий раз, когда вы хотите найти соответствие в конце строки, всегда тщательно продумывайте, нужно ли вам $ или \Z. Примеры, использующие '0' вместо '' для ясности:

>>> re.sub(r"^-+|-+\Z", lambda m: '0'*len(m.group()), "--ab--c-def--")
'00ab--c-def00'
>>> re.sub(r"^-+|-+\Z", lambda m: '0'*len(m.group()), "--ab--c-def--\n")
'00ab--c-def--\n'
>>> re.sub(r"^-+|-+$",  lambda m: '0'*len(m.group()), "--ab--c-def--\n")
'00ab--c-def00\n'
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...