【发布时间】:2018-11-08 15:01:55
【问题描述】:
我正在使用 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 文件并进行了查找。此文件中有多次出现。但是当我使用 re.sub 时,它只会替换一次。
编辑
似乎添加标志 re.MULTILINE 会阻止替换。有没有办法绕过去?
【问题讨论】:
-
@EvgenyPogrebnyak 我不这么认为。如果您对他的示例执行 findall() ,您只会得到一个匹配项。但是在这个例子中,我得到了多个匹配,但是 sub() 不能正常工作。
-
您基本上将
count设置为非零值,这可以防止 sub() 替换所有出现,我认为 -
隐含的@EvgenyPogrebnyak,应该是
re.compile中的flags=re.MULTILINE,而不是re.sub。 -
@EvgenyPogrebnyak:我编辑了我的评论,您不能在
re.sub中使用编译后的 RE 指定标志。 -
奖品归@cdarke ;)