我正在使用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会阻止替换。有办法绕行吗?
答案 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)