Удалите все символы не ascii между "<TYPE> GRAPHIC" и "</TEXT>" - PullRequest
0 голосов
/ 12 марта 2019

У меня есть txt-файл, загруженный из html, содержимое которого показано ниже.

<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>

Я хочу удалить все содержимое между <TYPE>GRAPHIC и </TEXT> и попытался re.sub('<TYPE>GRAPHIC(.*)</TEXT>', '', reader), но не работает.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Честно говоря, я думаю, что это законный вопрос, и он, возможно, задавался раньше, но 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), все остальное не возвращается и игнорируется.
0 голосов
/ 12 марта 2019

Вот попробуйте это:

re.sub("(?!<TYPE>GRAPHIC)\n(?:.|\n)+(?=<\/TEXT>)", "", text)
'<TYPE>GRAPHIC</TEXT>\n'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...