Re.subn не подменяет результаты - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь заменить некоторый контент из текста и удалить его.Используя 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.

1 Ответ

0 голосов
/ 29 января 2019

Если мое понимание правильное, попробуйте вместо этого:

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.
...