Замена значений в строке на что-то вроде <p *что-нибудь внутри нее*> на просто пустое '' или ничего

У меня есть абзац BeautifulSoup в виде строки. Я хочу заменить вхождение тегов п (открытие) и /п (закрытие) в строку с помощью регулярных выражений, потому что есть такие экземпляры, как

    <p class = "section-para">We would be happy to hear from you, Please 
    fill in the form below or mail us your requirements on<br/><span 
    class = "text-red">[email protected]</span></p> 

Но я не могу использовать универсальный

    ^< *>$

потому что мне нужны теги сильныйсильный>, б и h1,h1..h6 для разных целей.

Я знаю только основы RegEx, но не знаю, как его создавать и использовать. Может ли кто-нибудь помочь мне с созданием "включения", "исключения" (если есть). Как я могу сделать это для этой проблемы и как я могу заменить его простым ''

def formatting(string):
    this=['<h1>','</h1>','<h2>','</h2>','<h3>','</h3>','<h4>','</h4>','<h5>','</h5>','<h6>','</h6>','<b>','</b>','<strong>','</strong>']
    with_this=['\nh1 Tag:','\n','\nh2 Tag:','\n''\nh3 Tag:','\n''\nh4 Tag:','\n''\nh5 Tag:','\n''\nh6 Tag:','\n','\Bold:','\n''\nBold:','\n']

    for i in range(len(this)):
        if this[i] in string:
            string=string.replace(this[i],with_this[i])
    return(string)

Я использовал функции замены строк для тегов ч1,2...6. Любая помощь будет оценена по достоинству.

Если вы уже приложили усилия, чтобы использовать красивый суп для анализа вашего html, не используйте регулярное выражение. Regex никогда не рекомендуется для разбора/замены html

Chris Doyle 20.06.2019 15:01

Привет! Как правило, синтаксический анализ HTML с помощью RegEx считается дурацкой задачей. См. stackoverflow.com/a/1732454/3543867 . Есть много крайних случаев, с которыми вы можете столкнуться. Одной из распространенных ссылок для обработки html является модуль/библиотека BeautifulSoup — stackoverflow.com/questions/11709079/parsing-html-using-pyth‌​на.

Cinderhaze 20.06.2019 15:02

Хотя говорят, что Чак Норрис умеет использовать регулярное выражение в html...

Patrick Artner 20.06.2019 15:03

Хотя верно то, что вы не можете написать регулярное выражение, которое соответствует только допустимому html, и попытка сделать это в любом случае вызовет ужасный Zalgo в нашу реальность, простая попытка сопоставить открытие и закрытие тега <p> может быть на самом деле возможно. потому что вы не можете вложить <p> в другой <p> (или, по крайней мере, вы не должны).

Kevin 20.06.2019 15:06

@Kevin Так в чем же решение. Подойдет любая ссылка.

Mahesh 20.06.2019 15:10

На самом деле, я думаю, что неправильно понял вопрос. Если вы Только хотите заменить теги <p> и ничего больше, это возможно. Но похоже, вы также хотите заменить <b> и <strong>. Эти теги могу являются вложенными, поэтому вы не можете написать регулярное выражение, соответствующее им.

Kevin 20.06.2019 15:14

Чем вы хотите заменить <p>?

Chris Doyle 20.06.2019 15:26

@ChrisDoyle просто ''. х='123'; х.заменить('1',''); х=23

Mahesh 20.06.2019 15:41

@Kevin, даже когда я сохраняю все проанализированное значение в виде строки в переменной, а затем обрабатываю его посимвольно. Я знаю, что это глупейшая идея, но я не знаю другого метода.

Mahesh 20.06.2019 15:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
340
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Надеюсь, я вас правильно понял, и, пожалуйста, поправьте меня, если я ошибаюсь. У вас есть что-то вроде:

<p class = "section-para">We would be happy to hear from you, Please 
fill in the form below or mail us your requirements on<br/><span 
class = "text-red">[email protected]</span></p>

И хотите что-то вроде:

<p>We would be happy to hear from you, Please 
fill in the form below or mail us your requirements on<br/><span 
class = "text-red">[email protected]</span></p>

Вы можете просто сделать:

saved_content = re.search(
    '<p (.*?)>(?P<content>.*)</p>',
    your_string
).groupdict()

result = re.sub(
    r'<p (.*?)>(.*)</p>',
    f'<p>{saved_content.get("content")}</p>',
    your_string
)

Обратите внимание, что я использовал f-строки, которые доступны только в Python 3.6 или выше. Я надеюсь, что это помогло вам, и дайте мне знать, если я что-то неправильно понял или остались какие-либо вопросы. Хорошего дня!

Спасибо за ответ, примерно так. Но оригинальная работа, которую я хочу сделать, выглядит вот так.- stackoverflow.com/questions/56688597/…

Mahesh 20.06.2019 16:53

Если этот ответ является правильным для данного конкретного вопроса, вы должны отметить его как правильный ответ. Я посмотрю и другие вопросы.

Train 20.06.2019 16:55

Ваш другой вопрос не имеет смысла. зачем тег заголовка (h1,h2...h6) внутри тега p. тег заголовка по существу закрывает тег p с точки зрения древовидной структуры html. Если вы заглянете в FAQ, лучший способ получить помощь — это создать минимальный полный пример того, что вы пытаетесь сделать. Это означает, предоставить образец вашего ввода. покажите, что вы ожидаете получить на выходе, и покажите любой код, который вы пробовали.

Chris Doyle 20.06.2019 17:01
Ответ принят как подходящий

Неясно, что именно вы хотите заменить, но, возможно, приведенное ниже может помочь, оно позволит вам заменить теги текстом, если это то, что вам нужно. Я уверен, что вы сможете настроить fruther, чтобы он делал то, что вы хотите. Также вы не указали версию BS, которую вы используете. Я использую БС4. Функция возьмет объект «Прекрасный суп», тег для поиска, префикс, то есть то, чем вы хотите заменить начальный тег, и суффикс, то есть то, чем вы хотите заменить конечный тег.

from bs4 import BeautifulSoup

def format_soup_tag(soup, tag, prefix, suffix):
    target_tag = soup.find(tag)
    target_tag.insert_before(prefix)
    target_tag.insert_after(suffix)
    target_tag.unwrap()

html = '<p class  = "section-para">We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class  = "text-red" >[email protected]</span></p>'
soup = BeautifulSoup(html, features = "lxml")
print("###before modification###\n", soup, "\n")

format_soup_tag(soup, 'p', '\np tag: ', '\n')
print("###after p tag###\n", soup, "\n")

format_soup_tag(soup, 'strong', '\Bold: ', ' \Bold')
print("###after strong tag###\n", soup, "\n")

ВЫХОД

###before modification###
 <html><body><p class = "section-para">We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class = "text-red">[email protected]</span></p></body></html> 

###after p tag###
 <html><body>
p tag: We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class = "text-red">[email protected]</span>
</body></html> 

###after strong tag###
 <html><body>
p tag: We would be happy to hear from you, \Bold: Please fill in the form below \Bold or mail us your requirements on <br/><span class = "text-red">[email protected]</span>
</body></html> 
stackoverflow.com/questions/56688597/… . Это исходная проблема, над которой я работаю. Я использую БС4
Mahesh 20.06.2019 16:52

Спасибо за ответ, который был полезен. также я хочу добавить значения h1,h2,h3, как вы сделали для сильного, если они присутствуют в абзаце.

Mahesh 20.06.2019 16:58

Функция написана таким образом, чтобы быть гибкой, поэтому вы можете добавить больше строк, если хотите, например, format_soup_tag(soup, 'h1', '\nh1 tag: ', '\n'), вы даже можете создать словарь имен тегов с массивом префиксов и суффиксов и перебирать словарь

Chris Doyle 20.06.2019 17:04

Другие вопросы по теме