249 Stimmen

Teil einer Regex-Übereinstimmung extrahieren

Ich möchte einen regulären Ausdruck, um den Titel aus einer HTML-Seite zu extrahieren. Derzeit habe ich dies:

title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
    title = title.replace('<title>', '').replace('</title>', '') 

Gibt es einen regulären Ausdruck, der nur den Inhalt von <title> extrahiert, so dass ich die Tags nicht entfernen muss?

10 Stimmen

Wow, ich kann nicht glauben, dass all die Antworten dazu auffordern, die gesamte HTML-Seite zu analysieren, nur um einen einfachen Titel zu extrahieren. Was für ein Overkill!

5 Stimmen

Der Titel der Frage sagt alles - das angegebene Beispiel geschieht HTML zu sein, aber das allgemeine Problem ist ... allgemein.

6voto

Vinay Sajip Punkte 89444
re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)

4voto

Jim Dennis Punkte 16336

Ich denke, das sollte ausreichen:

#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)

... unter der Annahme, dass sich Ihr Text (HTML) in einer Variablen namens "text" befindet.

Dies setzt auch voraus, dass es keine anderen HTML-Tags gibt, die rechtmäßig in einen HTML-TITLE-Tag eingebettet werden können, und dass es keine Möglichkeit gibt, ein anderes <-Zeichen rechtmäßig in einen solchen Container/Block einzubetten.

Allerdings ...

Verwenden Sie keine regulären Ausdrücke für HTML-Parsing in Python. Verwenden Sie einen HTML-Parser! (Es sei denn, Sie wollen einen vollständigen Parser schreiben, was eine zusätzliche und überflüssige Arbeit wäre, wenn verschiedene HTML-, SGML- und XML-Parser bereits in den Standardbibliotheken enthalten sind).

Wenn Sie mit der "realen Welt" zu tun haben Tagessuppe HTML (das häufig nicht mit jedem SGML/XML-Validator konform ist), dann verwenden Sie die BeautifulSoup Paket. Es ist (noch) nicht in den Standardbibliotheken enthalten, wird aber allgemein für diesen Zweck empfohlen.

Eine andere Möglichkeit ist: lxml ... die für korrekt strukturiertes (standardkonformes) HTML geschrieben ist. Aber es hat eine Option, um auf BeautifulSoup als Parser zurückzugreifen: ElementSuppe .

4voto

Steve K Punkte 10201

Die zur Verfügung gestellten Codestücke kommen nicht mit Exceptions Darf ich vorschlagen

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]

Dies gibt standardmäßig eine leere Zeichenkette zurück, wenn das Muster nicht gefunden wurde, oder die erste Übereinstimmung.

3voto

bers Punkte 3627

Die derzeit am besten bewertete Antwort von Krzysztof Krason scheitert mit <title>a</title><title>b</title> . Außerdem ignoriert es Titel-Tags, die Zeilengrenzen überschreiten, z. B. aus Gründen der Zeilenlänge. Schließlich schlägt es fehl bei <title >a</title> (was gültiges HTML ist: Leerraum innerhalb von XML/HTML-Tags ).

Ich schlage daher folgende Verbesserung vor:

import re

def search_title(html):
    m = re.search(r"<title\s*>(.*?)</title\s*>", html, re.IGNORECASE | re.DOTALL)
    return m.group(1) if m else None

Testfälle:

print(search_title("<title   >with spaces in tags</title >"))
print(search_title("<title\n>with newline in tags</title\n>"))
print(search_title("<title>first of two titles</title><title>second title</title>"))
print(search_title("<title>with newline\n in title</title\n>"))

出力します。

with spaces in tags
with newline in tags
first of two titles
with newline
  in title

Letztlich schließe ich mich den Empfehlungen anderer an, die einen HTML-Parser empfehlen - nicht nur, aber auch, um die nicht standardmäßige Verwendung von HTML-Tags zu handhaben.

2voto

Stefan Falk Punkte 21571

Ich brauchte etwas Passendes package-0.0.1 (Name, Version), möchte aber eine ungültige Version zurückweisen, z. B. 0.0.010 .

Véase regex101 Beispiel.

import re

RE_IDENTIFIER = re.compile(r'^([a-z]+)-((?:(?:0|[1-9](?:[0-9]+)?)\.){2}(?:0|[1-9](?:[0-9]+)?))$')

example = 'hello-0.0.1'

if match := RE_IDENTIFIER.search(example):
    name, version = match.groups()
    print(f'Name:     {name}')
    print(f'Version:  {version}')
else:
    raise ValueError(f'Invalid identifier {example}')

出力します。

Name:     hello
Version:  0.0.1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X