python regex sub不会替换所有出现的内容

时间:2018-05-29 21:20:41

标签: python regex

我正在使用re.sub删除文本的某些部分。假设是多个匹配,但子函数每次执行只替换一次。到底是怎么回事?

import re
import requests

r = requests.get('https://www.sec.gov/Archives/edgar/data/66740/000155837018000535/0001558370-18-000535.txt')
text = r.content.decode()
reg = re.compile('<DOCUMENT>\n<TYPE>(XML|GRAPHIC|ZIP|EXCEL|PDF)[\s\S]*?(</DOCUMENT>)')

re.findall(reg, text) 

``
output: [('GRAPHIC', '</DOCUMENT>'),
 ('GRAPHIC', '</DOCUMENT>'),
 ('XML', '</DOCUMENT>'),
 ('XML', '</DOCUMENT>'),...]
``

for i in range(10):
    text = re.sub(reg, '', text, re.MULTILINE)
    print(len(text))
``
output: 41875141
40950114
37558399
36097349
34776527``

在第一个代码块中,我下载了txt文件并执行了findall。此文件中出现多次。但是当我使用re.sub时,它只替换一次出现。

修改

似乎添加标志re.MULTILINE会阻止替换。有办法绕行吗?

1 个答案:

答案 0 :(得分:1)

应使用re.MULTILINE关键字指定

flags。您选择的位置恰好是count参数 - 替换的匹配数(re.MULTILINE具有整数值8)。

但是,对于已编译的RE,您无法使用flags指定re.sub,而是在flags = re.MULTILINE中指定re.compile

reg = re.compile('<DOCUMENT>\n<TYPE>(XML|GRAPHIC|ZIP|EXCEL|PDF)[\s\S]*?(</DOCUMENT>)', flags=re.MULTILINE)