【问题标题】:Remove all non-ascii characters between "<TYPE>GRAPHIC" and "</TEXT>"删除“<TYPE>GRAPHIC”和“</TEXT>”之间的所有非ASCII字符
【发布时间】:2019-03-12 10:28:44
【问题描述】:

我有一个从 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>

我想删除&lt;TYPE&gt;GRAPHIC&lt;/TEXT&gt; 之间的所有内容并尝试re.sub('&lt;TYPE&gt;GRAPHIC(.*)&lt;/TEXT&gt;', '', reader) 但不起作用。

【问题讨论】:

  • 您可能需要添加单行模式和惰性量词,如下所示:re.sub('&lt;TYPE&gt;GRAPHIC(.*?)&lt;/TEXT&gt;', '', reader, flags = re.S)

标签: python regex ascii


【解决方案1】:

老实说,我认为这是一个合法的问题,可能以前也有人问过,但是 re.sub 的行为真的很奇怪,需要很多时间才能习惯,而且大多数答案都没有解释。它通常会忽略捕获组这一事实特别令人困惑,所以我不明白为什么你被'-1'ed

无论如何,这两种解决方案应该可以工作:

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>'
  • 对于(?&lt;=&lt;TYPE&gt;GRAPHIC),我是说最终捕获的内容必须在&lt;TYPE&gt;GRAPHIC 之前。通过这样做,我同时也在说不要对/捕获/删除(?&lt;=&lt;TYPE&gt;GRAPHIC) 本身采取行动
  • [\S\s]+ 我的意思是让这个捕获变得贪婪并查询以捕获所有文本
  • (?=&lt;/TEXT&gt;)我是说捕获的文本后面必须跟&lt;/TEXT&gt;才能被捕获,但是&lt;/TEXT&gt;最终不会在re.sub字符串结果中被删除,因为这是同时告诉 re.sub 不要实际捕获/采取行动/删除&lt;/TEXT&gt;

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(通过 @ 987654334@),其他所有内容都不会返回并被忽略。

【讨论】:

    【解决方案2】:

    这里试试这个:

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

    这里有一些复杂的正则表达式模式,如果你想知道它们是什么,这里references for lookahead and lookbehind

    【讨论】:

    • 您好,我使用此代码读取 txt 文件并尝试您的代码,但它不起作用并显示“内存错误”。使用 open(filename, 'r') 作为文件: text = file.read() result = re.sub("(?!GRAPHIC)\n(?:.|\n)+(?=)", "", 文本)
    • 您的文本文件有多大?这有点奇怪。
    • 请:不要 - 表达式 (?:.|\n)+ 是一场噩梦 - 改用适当的修饰符(例如单行 re.S)。
    • @metoikos 文本文件大小为 111,000 KB
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多