Подтвердить что ты не робот

Python заменяет шаблон строки с выходом функции

У меня есть строка в Python, скажем The quick @red fox jumps over the @lame brown dog.

Я пытаюсь заменить каждое из слов, начинающихся с @, на выход функции, которая принимает слово в качестве аргумента.

def my_replace(match):
    return match + str(match.index('e'))

#Psuedo-code

string = "The quick @red fox jumps over the @lame brown dog."
string.replace('@%match', my_replace(match))

# Result
"The quick @red2 fox jumps over the @lame4 brown dog."

Есть ли разумный способ сделать это?

4b9b3361

Ответ 1

Вы можете передать функцию re.sub. Функция получит объект соответствия в качестве аргумента, используйте .group(), чтобы извлечь совпадение в виде строки.

>>> def my_replace(match):
...     match = match.group()
...     return match + str(match.index('e'))
...
>>> re.sub(r'@\w+', my_replace, string)
'The quick @red2 fox jumps over the @lame4 brown dog.'

Ответ 2

Я не знал, что вы можете передать функцию в re.sub(). Riffing on @Janne Karila отвечает за решение проблемы, которую я использовал, и этот подход работает для нескольких групп захвата.

import re

def my_replace(match):
    match1 = match.group(1)
    match2 = match.group(2)
    match2 = match2.replace('@', '')
    return u"{0:0.{1}f}".format(float(match1), int(match2))

string = 'The first number is [email protected], and the second number is [email protected]'
result = re.sub(r'([0-9]+.[0-9]+)(@[0-9]+)', my_replace, string)

print(result)

Вывод:

The first number is 14.2, and the second number is 50.6000.

Этот простой пример требует наличия всех групп захвата (необязательных групп).

Ответ 3

Try:

import re

match = re.compile(r"@\w+")
items = re.findall(string)
for item in items:
    string = string.replace(item, my_replace(item)

Это позволит вам заменить все, что начинается с @, независимо от результата вашей функции. Я был не очень ясен, если вам нужна помощь в этой функции. Дайте мне знать, если это дело

Ответ 4

Короткий с регулярным выражением и уменьшающий:

>>> import re
>>> pat = r'@\w+'
>>> reduce(lambda s, m: s.replace(m, m + str(m.index('e'))), re.findall(pat, string), string)
'The quick @red2 fox jumps over the @lame4 brown dog.'