re.subn不替代结果

时间:2019-01-29 16:05:42

标签: python regex substitution

我正在尝试替换文本中的某些内容,并将其删除。我想使用subn替换并跟踪被替换的内容。

我的整个代码:

# -*- coding: UTF-8 -*-

import re

regex = re.compile(r'\<begin_block\>(.*?)\</end_block\>', re.MULTILINE | re.DOTALL)

test_str = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mi eros, eu euismod urna congue a. <begin_block> Some content here </end_block>Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada congue nec eget ipsum. \n"
            "<begin_block>\n"
            "Hello world!\n"
            "</end_block>\n"
            "Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est. \n"
            "<begin_block>\n"
            "##########\n"
            "</end_block>")

matches = re.finditer(regex, test_str)

for matchNum, match in enumerate(matches, start=1):
    print("Match {matchNum} was found: {match}".format(matchNum=matchNum,
                                                       match=match.group()))
    string, num = re.subn(regex, r'\n', test_str) 

有人可以解释我在做什么,但我看不到吗?

编辑:注释后,

例如,如果我搜索“ <begin_block>”,尽管我对它们进行了细分,但这仍然会找到所有3个标签。这就是为什么我不明白自己在做什么错。

编辑2:更多评论后,

我尝试过,将最后几行修改为:

for matchNum, match in enumerate(matches, start=1):
    string, num = re.subn(match.group(), r'\n', test_str)

print(string)

我的结果,内容未正确替换:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mi eros, eu euismod urna congue a. <begin_block> Some content here </end_block>Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada congue nec eget ipsum.
<begin_block>
Hello world!
</end_block>
Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra
aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est.

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,请尝试以下方法:

import re

regex = re.compile(r'\<begin_block\>(.*?)\</end_block\>', re.MULTILINE | re.DOTALL)

test_str = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mi eros, eu euismod urna congue a. <begin_block> Some content here </end_block>Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada congue nec eget ipsum. \n"
            "<begin_block>\n"
            "Hello world!\n"
            "</end_block>\n"
            "Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est. \n"
            "<begin_block>\n"
            "##########\n"
            "</end_block>")

matches = re.finditer(regex, test_str)

for matchNum, match in enumerate(matches, start=1):
    print("Match {matchNum} was found: {match}".format(matchNum=matchNum,
                                                       match=match.group()))
    test_str = test_str.replace(match.group(), '\n', count=1)

re.subn()将一次性替换所有内容,并返回发生的替换次数。但是,如果您有兴趣在matches迭代中一次替换一项,那么最好使用str.replace(),因为您不需要重新编译match.group()字符串并考虑其中的符号。

可以使用re.subn(..., count=1) to achieve a similar result, but it is moot because str.replace(...,count = 1)`可以达到相同的效果,并且您无需重新编译匹配字符串,并且极有可能表现更好。

结果:

Match 1 was found: <begin_block> Some content here </end_block>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mieros, eu euismod urna congue a. 
Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada conguenec eget ipsum. 
<begin_block>
Hello world!
</end_block>
Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est. 
<begin_block>
##########
</end_block>
Match 2 was found: <begin_block>
Hello world!
</end_block>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mi eros, eu euismod urna congue a. 
Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada congue nec eget ipsum. 


Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est. 
<begin_block>
##########
</end_block>
Match 3 was found: <begin_block>
##########
</end_block>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id lacus dapibus, sollicitudin nunc ut, posuere nisl. Fusce varius mi eros, eu euismod urna congue a. 
Integer posuere tempor nulla eget commodo. Mauris iaculis vehicula nisi pretium interdum. Curabitur nec quam vel eros malesuada congue nec eget ipsum. 


Vivamus aliquam lectus sapien, eget cursus libero congue sed. Mauris nulla metus, dictum ut semper non, sagittis non ipsum. Etiam fermentum pharetra aliquet. Morbi bibendum nulla quam, vitae vestibulum arcu bibendum a. Maecenas eget est vitae elit rhoncus scelerisque. Aliquam sagittis, ligula quis porttitor congue, ex nisi aliquam diam, ac ullamcorper quam lectus non est.