删除“ <type> GRAPHIC”和“”之间的所有非ASCII字符

时间:2019-03-12 10:28:44

标签: python regex ascii

我有一个从html直接下载的txt文件,其内容如下。

<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 个答案:

答案 0 :(得分:1)

老实说,我认为这是一个合法的问题,可能以前曾有人问过,但是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),其他所有内容都不会返回,而是会被忽略。

答案 1 :(得分:0)

在这里尝试:

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

这里有一些复杂的正则表达式模式,如果您对它们的用途感到好奇,请在这里references for lookahead and lookbehind