Python шаблон для замены слов в одинарных или двойных кавычках - PullRequest
1 голос
/ 31 марта 2020

Я новичок в Python и довольно плохо с регулярным выражением. Мое требование - изменить шаблон в существующем коде

Я извлек код, который пытаюсь исправить.

def replacer_factory(spelling_dict):
    def replacer(match):
        word = match.group()
        return spelling_dict.get(word, word)
    return replacer

def main():
    repkeys = {'modify': 'modifyNew', 'extract': 'extractNew'}
    with open('test.xml', 'r') as file :
        filedata = file.read()
    pattern = r'\b\w+\b' # this pattern matches whole words only
    #pattern = r'[\'"]\w+[\'"]'
    #pattern = r'["]\w+["]' 
    #pattern = '\b[\'"]\w+[\'"]\b'
    #pattern = '(["\'])(?:(?=(\\?))\2.)*?\1'

    replacer = replacer_factory(repkeys)
    filedata = re.sub(pattern, replacer, filedata)

if __name__ == '__main__':
    main()

Ввод

<fn:modify ele="modify">
<fn:extract name='extract' value="Title"/>
</fn:modify>

Ожидаемый вывод , Обратите внимание, что слова замены могут быть заключены в одинарные или двойные кавычки.

<fn:modify ele="modifyNew">
<fn:extract name='extractNew' value="Title"/>
</fn:modify>

Существующий шаблон r'\b\w+\b' приводит, например, <fn:modifyNew ele="modifyNew">, но я ищу это <fn:modify ele="modifyNew">

Шаблоны, которые я пробовал до сих пор, приведены в качестве комментариев. Поздно я понял, что некоторые из них неправильны, поскольку строковые литералы с префиксом r предназначены для специальной обработки backsla sh et c. Я все еще включаю их в обзор того, что я пытался сделать до сих пор.

Было бы замечательно, если бы я мог получить образец для решения этой проблемы, а не менять логи c. Если это невозможно сделать с помощью существующего кода, пожалуйста, укажите на это. В среде, в которой я работаю, Python 2,6

Любая помощь приветствуется.

1 Ответ

1 голос
/ 31 марта 2020

Вам необходимо использовать r'''(['"])(\w+)\1''' регулярное выражение, а затем вам нужно адаптировать метод замены:

def replacer_factory(spelling_dict):
    def replacer(match):
        return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
    return replacer

Слово, с которым вы сопоставляете (['"])(\w+)\1, либо в двойных, либо в одинарных кавычках, но значение находится в группе 2, следовательно, используется spelling_dict.get(match.group(2), match.group(2)). Кроме того, кавычки должны быть возвращены, следовательно, '{0}{1}{0}'.format().

См. Python demo :

import re
def replacer_factory(spelling_dict):
    def replacer(match):
        return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
    return replacer

repkeys = {'modify': 'modifyNew', 'extract': 'extractNew'}
pattern = r'''(['"])(\w+)\1'''
replacer = replacer_factory(repkeys)
filedata = """<fn:modify ele="modify">
<fn:extract name='extract' value="Title"/>
</fn:modify>"""
print( re.sub(pattern, replacer, filedata) )

Вывод:

<fn:modify ele="modifyNew">
<fn:extract name='extractNew' value="Title"/>
</fn:modify>
...