回复sub即使找到regex模式也无法执行?

2024-09-30 20:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑我在Python2.7上运行的这个示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

tstr = r'''    <div class="thebibliography">
   <p class="bibitem" ><span class="biblabel">
 [1]<span class="bibsp">   </span></span><a
 id="Xtester"></a><span
class="cmcsc-10">A<span
class="small-caps">k</span><span
class="small-caps">e</span><span
class="small-caps">g</span><span
class="small-caps">c</span><span
class="small-caps">t</span><span
class="small-caps">o</span><span
class="small-caps">r</span>,</span>
   <span
class="cmcsc-10">P. D.</span><span
class="cmcsc-10"> H.  </span> testöng ... .  <span
class="cmti-10">Draftin:</span>
   <a
href="http://www.example.com/test.html" class="url" ><span
class="cmitt-10">http://www.example.com/test.html</span></a> (2001).
</p>
   </div>

'''

# remove <a id>
tout2 = re.sub(r'''<a[\s]*?id=['"].*?['"][\s]*?></a>''', " ", tstr, re.DOTALL)
# remove class= in <a
regstr = r'''(<a.*?)(class=['"].*?['"])([\s]*>)'''
print(  re.findall(regstr, tout2, re.DOTALL))             # finds
print("------") #
print(      re.sub(regstr, "AAAAAAA", tout2, re.DOTALL )) # does nothing?

当我运行这个命令时-第一个正则表达式被替换/sub'd,正如预期的那样(不见了);然后在输出中我得到:

[('<a\nhref="http://www.example.com/test.html" ', 'class="url"', ' >')]

。。。这意味着第二个正则表达式编写正确(三个部分都找到了)-但是,当我尝试用“aaaaaaaaa”替换所有片段时-在输出的这部分中什么也没有发生:

------
    <div class="thebibliography">
   <p class="bibitem" ><span class="biblabel">
 [1]<span class="bibsp">   </span></span> <span
class="cmcsc-10">A<span
class="small-caps">k</span><span
class="small-caps">e</span><span
class="small-caps">g</span><span
class="small-caps">c</span><span
class="small-caps">t</span><span
class="small-caps">o</span><span
class="small-caps">r</span>,</span>
   <span
class="cmcsc-10">P. D.</span><span
class="cmcsc-10"> H.  </span> testöng ... .  <span
class="cmti-10">Draftin:</span>
   <a
href="http://www.example.com/test.html" class="url" ><span
class="cmitt-10">http://www.example.com/test.html</span></a> (2001).
</p>
   </div>

很明显,这里没有“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。你知道吗

问题是什么?我应该怎么做才能让sub替换那些显然已经找到的匹配项?你知道吗


Tags: testdivrecomidhttpurlexample
3条回答

为什么不使用HTML解析器来解析和修改HTML。你知道吗

例如,使用^{}^{}

from bs4 import BeautifulSoup

data = """Your html here"""
soup = BeautifulSoup(data)

for link in soup('a', id=True):
    link.replace_with('AAAAAA')

print(soup.prettify())

这将用AAAAAA文本替换所有具有id属性的链接:

<div class="thebibliography">
<p class="bibitem">
<span class="biblabel">
 [1]
 <span class="bibsp">
 </span>
</span>
AAAAAA
<span class="cmcsc-10">
...

另请参见:

您的替代品由于使用不当而无法使用回复sub方法,如果您查看文档:

re.sub(pattern, repl, string, count=0, flags=0)

但是在你的代码里,你把“旗帜”放在“计数”的地方。这就是re.DOTALL标志被忽略的原因,因为它位于错误的位置。你知道吗

由于不需要使用count参数,因此可以删除re.DOTALL标志,改用内联修饰符:

regstr = r'''(?s)(<a.*?)(class=['"].*?['"])([\s]*>)'''

然而,使用类似bs4的东西可能更方便。(如@alecxe answer中所示)。你知道吗

很简单:Python标准库参考说语法或re.sub是:re.sub(pattern, repl, string, count=0, flags=0)。所以你的最后一个子实际上是(如re.DOTALL==16):

re.sub(regstr, "AAAAAAA", tout2, count = 16, flags = 0 )

当您需要时:

re.sub(regstr, "AAAAAAA", tout2, flags = re.DOTALL )

最后的潜艇工作得很好。。。你知道吗

相关问题 更多 >