Как удалить теги из строки в Python, используя регулярные выражения?(НЕ в HTML) - PullRequest
11 голосов
/ 07 сентября 2010

Мне нужно удалить теги из строки в python.

<FNT name="Century Schoolbook" size="22">Title</FNT>

Какой самый эффективный способ удалить весь тег с обоих концов, оставив только «Заголовок»?Я видел только способы сделать это с тегами HTML, и это не сработало для меня в Python.Я использую это особенно для ArcMap, ГИС-программы.У него есть собственные теги для элементов макета, и мне просто нужно удалить теги для двух конкретных текстовых элементов заголовка.Я считаю, что регулярные выражения должны хорошо работать для этого, но я открыт для любых других предложений.

Ответы [ 6 ]

52 голосов
/ 08 сентября 2010

Это должно работать:

import re
re.sub('<[^>]*>', '', mystring)

Всем, кто говорит, что регулярные выражения не являются подходящим инструментом для работы:

Контекст проблемы таков, что все возражения относительно обычных / контекстно-свободных языков являются недействительными. Его язык по сути состоит из трех сущностей: a = <, b = > и c = [^><]+. Он хочет удалить все случаи acb. Это довольно прямо характеризует его проблему как проблему с контекстно-свободной грамматикой, и не намного сложнее охарактеризовать ее как обычную.

Я знаю, что всем нравится ответ «Вы не можете разобрать HTML с помощью регулярных выражений», но ОП не хочет его анализировать, он просто хочет выполнить простое преобразование.

4 голосов
/ 30 декабря 2015

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

Вы можете использовать функцию BeautifulSoup get_text().

from bs4 import BeautifulSoup

text = '<FNT name="Century Schoolbook" size="22">Title</FNT>'
soup = BeautifulSoup(text)

print(soup.get_text())
3 голосов
/ 08 сентября 2010

Поиск этого регулярного выражения и замена его пустой строкой должны работать.

/<[A-Za-z\/][^>]*>/

Пример (из оболочки python):

>>> import re
>>> my_string = '<FNT name="Century Schoolbook" size="22">Title</FNT>'
>>> print re.sub('<[A-Za-z\/][^>]*>', '', my_string)
Title
1 голос
/ 08 сентября 2010

Если исходный текст представляет собой правильно сформированный XML, вы можете использовать модуль stdlib ElementTree :

import xml.etree.ElementTree as ET
mystring = """<FNT name="Century Schoolbook" size="22">Title</FNT>"""
element = ET.XML(mystring)
print element.text  # 'Title'

Если исходный текст не правильно сформирован, то BeautifulSoup является хорошимпредложение.Использование регулярных выражений для разбора тегов не очень хорошая идея, как отмечают несколько авторов.

1 голос
/ 08 сентября 2010

Если это только для анализа и извлечения значения, вы можете взглянуть на BeautifulStoneSoup.

0 голосов
/ 08 сентября 2010

Используйте синтаксический анализатор XML, например ElementTree.Регулярные выражения не являются подходящим инструментом для этой работы.

...