Задать вопрос
DarkWood
@DarkWood

Python: множественная замена из списка, состоящего из RegExp. Как использовать нумерацию групп и флаги компиляции?

Здравствуйте.

В настоящий момент имеется следующий код:

import re

SUBS = [
  (r'(Шаг \d+)', r'[COLOR=orange][SIZE=7]\1[/SIZE][/COLOR]'),  
  (r'(^\d+.*$)', r'[COLOR=orange][SIZE=7]\1[/SIZE][/COLOR]'),
]

file = open('d:/text_sample.txt','r')
text = file.read()

def add():
        for pattern, replacement in SUBS:
                result = re.sub(pattern, replacement, text)
        return result

file.close()
file1 = open('d:/text_sample.txt','w')
file1.write(add())
file1.close()


Как видите он берет первое значение каждого кортежа из списка в качестве паттерна для re.sub и второе значение - как заменитель для него же.

Первый вопрос: как нумеровать группы в подстановочных значениях?
Второй вопрос: можно ли использовать флаги компиляции (re.compile) или саму компиляцию? Если можно, то как?

Почему у меня возникает второй вопрос? Значения замены во второй строке изначально писались как самостоятельные и имели такой вид:

section_replace = re.compile(r'(^\d+.*$)', re.MULTILINE)
section_result = section_replace.sub(r'[COLOR=orange][SIZE=7]\1[/SIZE][/COLOR]', text)


То есть, используют флаг компиляции. Может быть, можно изменить выражение поиска на иное, без флага? Оно ищет заголовки разделов (выделено жирным):

1. Название пункта

Абзац с текстом

2. Название второго пункта

Абзац с текстом

и т.д.

По сути, показанный выше код в настоящий момент работает, только если удалить вторую строку из списка замен

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

P.S. Python не знаю лишь чуть менее, чем совсем. Решение взято отсюда.
  • Вопрос задан
  • 591 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@lcd1232
def add():
        result = text
        for pattern, replacement in SUBS:
                result = re.sub(pattern, replacement, result)
        return result
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DarkWood
@DarkWood Автор вопроса
Вроде бы разобрался с компиляцией. Изменил код следующим образом:

import re

step_replace = re.compile(r'(Шаг \d+)')
section_replace = re.compile(r'(^\d.+$)', re.MULTILINE)

SUBS = [
        (step_replace, r'[COLOR=orange][SIZE=7]\1[/SIZE][/COLOR]'),
        (section_replace, r'[COLOR=orange][SIZE=7]\1[/SIZE][/COLOR]'), 
]

file = open('d:/text_sample.txt','r')
text = file.read()

def add():
        for pattern, replacement in SUBS:
                result = re.sub(pattern, replacement, text)
        return result

file.close()
file1 = open('d:/text_sample.txt','w')
file1.write(add())
file1.close()


Но теперь проблема в том, что в файл записывается лишь последняя строка в списке замен (в данном случае section_replace).

Как записать все замены?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы