Получение шаблона, сопоставленного с объектом сопоставления - PullRequest
0 голосов
/ 26 октября 2019

Я работаю с регулярным выражением Python и пытаюсь получить сопоставление с шаблоном из сопоставляемого объекта, а не с самим текстом.

У меня есть несколько шаблонов для замены, и я делаю это:

import re

patterns = {
    r'^[ |\n]+': '',
    r'[ |\n]+$': '',
    r'[ |\n]+': ' '
}

text = ' Hello there,  I\n need your help  here    plase :) '
text = re.sub('|'.join(patterns.keys()),
              lambda match: patterns[ match.group(0) ],
              text)

Но это неправильное решение, потому что match.group(0) возвращает совпадающий текст, поэтому ни один из них не будет равен любому ключу шаблонов dict.

Я пытался match.pattern, но получил исключение и попыталсяmatch.re, но это дает все re.compile объект и его образец для этой проблемы '^[ |\n]+|[ |\n]+$|[ |\n]+'. Я буду очень признателен за вашу помощь.

РЕДАКТИРОВАТЬ: на основе решения Barmar Я получил это:

import re

patterns = [
    (r'^[ |\n]+', ''),
    (r'[ |\n]+$', ''),
    (r'[ |\n]+', ' ')
]

def getreplacement(match):
    for i, group in enumerate(match.groups()):
        if group:
            return patterns[ i ][ 1 ]

text = ' Hello there,  I\n need your help  here    plase :) '
text = re.sub('|'.join('(' + p[ 0 ] + ')' for p in patterns), getreplacement, text)
print(text)

Но все еще не способ всегда получить шаблон изгруппа матчей.

1 Ответ

0 голосов
/ 26 октября 2019

Я не думаю, что есть способ напрямую определить, какая альтернатива соответствует.

Используйте список вместо словаря и поместите каждый шаблон в группу захвата. Затем вы можете увидеть, какая группа захвата соответствует, и использовать ее в качестве индекса для получения соответствующей замены.

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

import re

patterns = [
    (r'^[ |\n]+', ''),
    (r'[ |\n]+$', ''),
    (r'[ |\n]+', ' ')
]

def getreplacement(match):
    for i in range(1, match.groups):
        if match.group(i):
            return patterns[i-1][1]

text = ' Hello there,  I\n need your help  here    plase :) '
text = re.sub('|'.join('(' + p[0] + ')' for p in patterns), getreplacement, text)
...