【问题标题】:python regex sub does not replace all occurrence [duplicate]python regex sub不会替换所有出现的[重复]
【发布时间】: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 ;)

标签: python regex


【解决方案1】:

re.MULTILINE 应使用 flags 关键字指定。您选择的位置恰好是 count 参数 - 替换的匹配数(re.MULTILINE 的整数值为 8)。

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

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

【讨论】:

  • 更不用说这个问题是个骗子,为什么你建议使用re.MULTILINE'&lt;DOCUMENT&gt;\n&lt;TYPE&gt;(XML|GRAPHIC|ZIP|EXCEL|PDF)[\s\S]*?(&lt;/DOCUMENT&gt;)' 模式,既没有^ 也没有$?真正的解决方案是完全删除论点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2010-09-07
  • 2019-10-23
相关资源
最近更新 更多