我有一个从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)
,但是不起作用。
答案 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”表示引擎将以“原始字符串”模式对其进行处理 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