2016-08-17 3 views
4

Das ist mein regexWie kann ich Schritte im regulären Python-Ausdruck reduzieren?

([^>] + [<]?)/(?! a)? (?: br | p)

Dies ist Beispiel

<r> this is text which I do not want <a> This is what I want!<br>

ich möchte nur Text verschrotten zwischen '>' und '< br oder p'

Diese Regex funktioniert genau ich will, aber ich merke, dass es zu viel Zeit braucht.

Ich lief dies auf Regex-Debugger dauerte über 800 Schritt, um falsche Satz zu überprüfen.

Wie kann ich es beheben?

+0

Ich glaube, Sie brauchen '> ([^ <] +) <(?: br | p) \ b 'und verwenden Sie es mit' re.findall'. Siehe https://ideone.com/z9hVQ4 –

Antwort

1

Ihre ([^>]+?[<])/?(?!a)(?:br|p) Muster bedeuten:

  • ([^>]+?[<]) - in Gruppen Capture-1 ein oder mehr (aber so wenig wie möglich) Zeichen außer > bis zum ersten <
  • /? - paßt ein optionales / Symbol
  • (?!a)(?:br|p) - entspricht entweder br oder p, die mit a nicht gestartet werden (so, der Look-Ahead macht keinen Sinn).

Im Grunde ist es gibt nur Text vor </br>, <br oder <p. Sie können nur

>([^<]+)</?(?:br|p)\b 

verwenden Siehe die regex demo (21 Schritte auf Ihrer gültige Übereinstimmung und 9 Schritte gegen den nicht-passenden String <r> this is text which I do not want <a> This is what I want!br>).

Muster Details:

  • > - eine wörtliche >
  • ([^<]+) - Capture-Gruppe 1 gefundene ein oder mehrere andere Zeichen als <
  • < - eine wörtliche <
  • /? - ein optional (eins oder null) /
  • (?:br|p)\b - entweder br oder p, gefolgt von einer Wortgrenze (nach diesen Werten muss ein Nicht-Wort-Zeichen vorhanden sein).

Python demo:

import re 
p = re.compile(r'>([^<]+)</?(?:br|p)\b') 
s = "<r> this is text which I do not want <a> This is what I want!<br>" 
print(p.findall(s)) 
+1

Vielen Dank! Diese Antwort ist genau das, was ich wollte! –

0

Dies sind weniger Schritte:

>([^<]+)<(?:br|p)

https://regex101.com/r/hS2dI4/2

+0

Vielen Dank für Ihre Antwort, aber ich möchte Text zwischen '>' und '
und
verschrotten. Dieser Text ist nur eines der einfachen Beispiele. –

+0

Dann machen Sie ein komplexes Beispiel. Mache fünf Beispiele. Wann immer Sie Fragen zu Regexp stellen, sollten Sie genügend Beispiele geben, um klarzustellen, was Sie akzeptieren und was Sie ablehnen möchten. – Amadan

+0

@ 심형보 Meine Antwort aktualisiert – Jack

Verwandte Themen