re.subn 不替代结果
The re.subn doesn't subsitute the results
我正在尝试替换文本中的一些内容,然后将其删除。使用 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 个标签,尽管我在它们上面添加了 运行 subn。这就是为什么我不明白我做错了什么。
编辑 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.
如果我的理解是正确的,试试这个:
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()
将一次性替换所有内容,并且 return 发生了替换次数。但是,如果您有兴趣在 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.
我正在尝试替换文本中的一些内容,然后将其删除。使用 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 个标签,尽管我在它们上面添加了 运行 subn。这就是为什么我不明白我做错了什么。
编辑 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.
如果我的理解是正确的,试试这个:
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()
将一次性替换所有内容,并且 return 发生了替换次数。但是,如果您有兴趣在 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.