Честно говоря, я думаю, что это законный вопрос, и он, возможно, задавался раньше, но re.sub ведет себя очень странно и требует много привыкания, и большинство ответов действительно не объясняют его. Тот факт, что он часто игнорирует группы захвата, особенно запутан, поэтому я не понимаю, почему вы были '-1'
В любом случае, эти два решения должны работать:
1.
>>> import re
>>> reader = '''<TYPE>GRAPHIC
<TEXT>
.....
Example of omitted part: M%$2G]\U?HQM7L^!5K*'5E/1@0?IQ5\S^0/\
G$O\IORU\W:1YV\MKK(UK1#
(I guess are some kind of non-Ascii characters)
.....
</TEXT>'''
>>> re.sub("(?<=<TYPE>GRAPHIC)[\S\s]+(?=</TEXT>)", "", reader)
'<TYPE>GRAPHIC</TEXT>'
- С
(?<=<TYPE>GRAPHIC)
Я говорю, что тому, что в конечном счете захвачено, должно предшествовать <TYPE>GRAPHIC
. Делая это, я также одновременно говорю, не действуй на / захватить / удалить (?<=<TYPE>GRAPHIC)
сам
- С
[\S\s]+
Я говорю, сделайте этот захват жадным и запросите захват всего текста
- С
(?=</TEXT>)
Я говорю, что за захваченным текстом должно следовать </TEXT>
, чтобы быть захваченным, но </TEXT>
не будет в конечном счете удалено в результате строки re.sub, потому что это одновременно говоря re.sub фактически не захватывать / действовать на / удалить </TEXT>
.
2.
>>> import re
>>> reader = '''<TYPE>GRAPHIC
<TEXT>
.....
Example of omitted part: M%$2G]\U?HQM7L^!5K*'5E/1@0?IQ5\S^0/\
G$O\IORU\W:1YV\MKK(UK1#
(I guess are some kind of non-Ascii characters)
.....
</TEXT>'''
>>> parsed = re.sub(r'(<TYPE>GRAPHIC)[\S\s]+(</TEXT>)', r'\1\n\n\2', reader)
>>> print(parsed)
<TYPE>GRAPHIC
</TEXT>
- С
re.sub
«r» перед регулярным выражением означает, что двигатель будет обрабатывать его в режиме «необработанной строки»
- Этим я могу открыть регулярное выражение для печати определенных захваченных групп
- Дополнительным предостережением является то, что re.sub таким образом обычно работает обратно (на самом деле обратно) к тому, что вы ожидаете от того, что вы пытаетесь сделать, что исключает текст
- Предоставляя аргумент
r'\1\n\n\2'
Я говорю, что сохраняйте / печатайте мою захваченную группу 1 (через \1
), помещайте символы новой строки между и сохраняйте / печатайте мою захваченную группу 2 (через \2
), все остальное не возвращается и игнорируется.