2010-09-07 1 views
11

Мне нужно удалить теги из строки в python.Как удалить теги из строки в python с помощью регулярных выражений? (НЕ в HTML)

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

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

+0

вы хотите Название быть Название когда сделано, или заголовок или <> Title <> или? , не уверен, из вашего вопроса, что вы после? – Doon

+0

Итак, как должна выглядеть эта строка после обработки? Я не совсем понимаю, что вы хотите сделать. –

+2

Извините. После обработки строка должна быть «Заголовок». –

ответ

48

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

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

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

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

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

+0

Это не сработало. Он вернул исходную строку. Спасибо, хотя –

+0

Извините, я забыл все важные символы '*'. Попробуй еще раз? – Domenic

+0

Это сработало! Благодарю. Это все, что мне нужно. –

2

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

3

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

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

Пример (из питона оболочки):

>>> import re 
>>> my_string = '<FNT name="Century Schoolbook" size="22">Title</FNT>' 
>>> print re.sub('<[A-Za-z\/][^>]*>', '', my_string) 
Title 
+0

Это тоже не сработало. Не могли бы вы привести мне пример того, как вы будете искать и заменять это? Я попробовал, и он вернул исходную строку. –

+0

Добавлен пример. Вы забыли 'import re'? –

1

Если исходный текст хорошо сформированный 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' 

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

+0

Если FNT будет содержать другой тег в середине «Название», будет напечатана только часть с внутренним тегом. – vvondra

-2

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

+0

Если вход не гарантированно правильно сформированный XML, в этом случае регулярное выражение, возможно, является разумным инструментом для работы. Я также готов поспорить, что регулярное выражение будет выполнять значительно быстрее, чем обработка строки в виде XML-документа. –

+2

Если вход не является правильно сформированным XML, то реализация полного анализатора будет правильным способом для этого. Грамматика достаточно сложна, что регулярных выражений недостаточно. –

2

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

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

from bs4 import BeautifulSoup 

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

print(soup.get_text())