Замените группу захвата на возвращаемое значение из передачи группы захвата в функцию - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь заменить указанную c группу захвата на возвращаемое значение из передачи указанной группы захвата в функцию. Следующий код находится в Python:

def translateWord(word):
    ... do some stuff
    return word

def translateSentence(sentence):
    # ([alpha and ']+) [non-alpha]*
    # keep the () part, ignore the rest
    p = re.compile(r"([a-zA-Z']+)[^a-zA-Z]*")

    # find each match, then translate each word and replace
    return p.sub(lambda match: translateWord(match.group(1)), sentence)

Этот код заменяет все совпадение в отличие от группы захвата.

Пример неверного вывода:

>>> sentence = This isn't my three-egg omelet.
>>> sentence = translateSentence(sentence)
>>> print(sentence)

Isthayisn'tyayymayeethrayeggyayomeletyay

Код должен выводить это вместо:

Isthay isn'tyay ymay eethray-eggyay omeletyay.

Функция translateWord() должна только работать на строковом вводе. Я мог бы проверить , какой ввод вводит функция и изменить поведение, основываясь на этом, но это противоречит цели. Как правильно это сделать?

1 Ответ

0 голосов
/ 24 марта 2020

В любом случае, просто попробуйте:

return p.sub(lambda match: translateWord(match.group(1)), sentence)

Похоже, вы запутались в том, что передавать в качестве второго параметра в re.sub: вы передаете реальную функцию (в данном случае лямбда-выражение) Нет необходимости пытаться встроить это в строку.

Однако, если вы хотите изменить только группу, методы re не дают ей прямой поддержки - вместо этого вам нужно воссоздать одну строку со всем соответствием, заменив нужные группы. изменить себя.

Самый простой способ - расширить вашу функцию «лямбда» в другую многострочную функцию, которая сделает это за вас. Затем он может использовать атрибут .regs в полученном объекте сопоставления, чтобы узнать пределы групп (начало и конец), и построить заменяющую строку:


def replace_group(match):
    sentence = translateWord(match.group(1))
    matched = match.group(0)
    new_sentence = matched[:match.regs[1][0]] + sentence + matched[match.regs[1][1]:] 
    return new_sentence
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...