Jak usunąć znaczniki z ciągu znaków w Pythonie za pomocą wyrażeń regularnych? (Nie w HTML)

Muszę usunąć znaczniki z łańcucha w Pythonie.

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

Jaki jest najskuteczniejszy sposób na usunięcie całego tagu na obu końcach, pozostawiając tylko "Title"? Widziałem tylko sposoby, aby to zrobić ze znacznikami HTML, a to nie działa dla mnie w Pythonie. Używam tego szczególnie dla ArcMap, programu GIS. Ma własne tagi dla swoich elementów układu, a ja po prostu muszę usunąć tagi dla dwóch konkretnych elementów tekstu tytułu. Uważam, że wyrażenia regularne powinny działać dobrze, ale jestem otwarty do wszelkich innych sugestii.

Author: Daniel Vandersluis, 2010-09-07

6 answers

To powinno zadziałać:

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

Do wszystkich mówiących, że wyrażenia regularne nie są właściwym narzędziem do zadania:

Kontekst problemu jest taki, że wszystkie zastrzeżenia dotyczące języków zwykłych/bezkontekstowych są nieważne. Jego język zasadniczo składa się z trzech Bytów: a = <, b = >, i c = [^><]+. Chce usunąć wszelkie wystąpienia acb. To dość bezpośrednio charakteryzuje jego problem jako jeden obejmujący gramatykę bez kontekstu, i nie jest dużo trudniejsze do scharakteryzuj go jako zwykły.

Wiem, że każdy lubi odpowiedź "nie możesz parsować HTML za pomocą wyrażeń regularnych", ale OP nie chce tego parsować, chce tylko wykonać prostą transformację.

 50
Author: Domenic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-14 19:46:31

Przeszukanie tego wyrażenia regularnego i zastąpienie go pustym łańcuchem powinno zadziałać.

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

Przykład (z powłoki Pythona):

>>> import re
>>> my_string = '<FNT name="Century Schoolbook" size="22">Title</FNT>'
>>> print re.sub('<[A-Za-z\/][^>]*>', '', my_string)
Title
 3
Author: Dagg Nabbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 21:32:34

Jeśli służy tylko do parsowania i pobierania wartości, możesz spojrzeć na BeautifulStoneSoup.

 2
Author: Eric Fortin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 20:04:06

Należy unikać używania wyrażeń regularnych. Mimo, że regex będzie działał na Twoim prostym łańcuchu, ale dostaniesz problem w przyszłości, jeśli otrzymasz złożony.

Możesz użyć funkcji BeautifulSoup get_text().

from bs4 import BeautifulSoup

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

print(soup.get_text())
 2
Author: Aminah Nuraini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 18:18:47

Jeśli tekst źródłowy jest dobrze uformowany XML, możesz użyć modułu 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'

Jeśli źródło nie jest dobrze uformowane, BeautifulSoup jest dobrą sugestią. Używanie wyrażeń regularnych do analizowania znaczników nie jest dobrym pomysłem, jak zauważyło kilka plakatów.

 1
Author: ianmclaury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 21:16:35

Użyj parsera XML, takiego jak ElementTree. Wyrażenia regularne nie są odpowiednim narzędziem do tego zadania.

 -2
Author: Nathan Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 21:00:38