Я работаю с регулярным выражением 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]+'
.
EDIT: на основе решения 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)
Но все же это не способ всегда получать шаблон из группы соответствия.