Code:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
Es wird erwartet, <br><br />A
zurück, aber es gibt einen leeren String ''
!
Irgendwelche Vorschläge?
Code:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
Es wird erwartet, <br><br />A
zurück, aber es gibt einen leeren String ''
!
Irgendwelche Vorschläge?
Gierigkeit funktioniert von links nach rechts, aber nicht anders. Es bedeutet im Grunde "nicht übereinstimmen, wenn Sie nicht übereinstimmen". Hier ist was los:
<br
zu Beginn der Zeichenfolge..*?
wird für jetzt ignoriert, es ist faul.>
zu entsprechen, und ist erfolgreich.\w
übereinzustimmen und schlägt fehl. Jetzt ist es interessant - die Engine startet Backtracking und sieht die .*?
Regel. In diesem Fall kann .
die erste >
übereinstimmen, also gibt es noch Hoffnung für dieses Spiel.>\w
übereinstimmen, aber $
schlägt fehl. Auch hier kommt der Motor auf die faulen .*
Regel zurück, und Matching hält, bis es zum Glück <br><br />A<br />B
paßt, gibt es eine einfache Lösung: Durch <br[^>]*>\w$
ersetzen Sie dies nicht tun passende außerhalb Ihrer Tags erlauben, so Es sollte das letzte Vorkommen ersetzen.
Genau genommen funktioniert dies nicht gut für HTML, weil Tag-Attribute >
Zeichen enthalten können, aber ich nehme an, es ist nur ein Beispiel.
Die Non-Gierigkeit wird später nicht so beginnen. Es entspricht der ersten <br
und wird nicht gierig mit dem Rest übereinstimmen, der tatsächlich an das Ende der Zeichenfolge gehen muss, weil Sie die $
angeben.
Um es die Art und Weise funktioniert Sie verwenden
/<br[^<]*?>\w$/
aber in der Regel ist es nicht zu verwenden regex empfohlen wollte HTML zu analysieren, da einige Wert des Attributs <
oder >
darin haben kann.
Bitte verwenden Sie niemals 'str' als Variablenname. –
Danke an Ihren Vorschlag. –
Äh ... hey ... Sie analysieren HTML nicht mit regulären Ausdrücken, oder? – detly