2016-04-02 15 views
2

In RegExr.com, im Abschnitt Beispiele, gibt es einen Code für 2-5 Buchstaben Palindrome. Die Verwendung genau des gleichen Musters in Python scheint nicht alle Ergebnisse als RegExr zu erfassen!Gleiches Muster, aber unterschiedliche Ergebnisse

Python fängt keine Wörter mit weniger als 4 Zeichen ein, wie "Vater" und "555". Der Code ist dies

\b(\w)?(\w)\w?\2\1 

Was ist der Grund für diese unterschiedlichen Ergebnisse?

+0

Werfen Sie einen Blick [hier] (http://stackoverflow.com/questions/23321575/regular-expression-for-finding-palindromes-behaving-strange) –

+0

Möchten Sie auch ein wenig Python-Code enthalten? d. h. verwenden Sie 're.match (" \ b (\ w)? (\ w) \ w? \ 2 \ 1 ")'? –

Antwort

1

Es arbeitet mit einer bedingten in Python, wenn die erste Erfassungsgruppe wiederholt wird:

\b(\w)?(\w)\w?\2(?(1)\1)

Die (?(1)\1) zu übersetzt: wenn die erste Erfassungsgruppe erfolgreich war, passen die erste wieder gefangen Gruppe.

Die Unterschiede sind höchstwahrscheinlich darauf zurückzuführen, dass die Regex-Engines eine optionale nicht übereinstimmende Erfassungsgruppe unterschiedlich behandeln. Z.B. RegExr verwendet die JavaScript-Engine in Ihrem Browser, die eine leere Erfassungsgruppe als nicht definiert behandelt. Wenn undefined versucht wird, am Ende der Zeichenfolge erneut übereinzustimmen, wird es erfolgreich sein. In Python ist dies jedoch anders und wird nur dann erfolgreich sein, wenn die optionale Erfassungsgruppe erfolgreich war. Es kommt nur auf Implementierungsdetails an.

+0

Vielen Dank für Ihre klare und hilfreiche Erklärung :) – MKab

+1

Beachten Sie, dass, wenn Sie die Fragezeichen * innerhalb * der Gruppen setzen, der ursprüngliche Regex in jedem Geschmack funktioniert, wie Sie [hier] sehen können (https://regex101.com/r/gR1dC1/1). Auf diese Weise können die Gruppen nichts erreichen, während sie noch am Spiel teilnehmen. ECMAScript (die Spezifikation hinter JavaScript und ActionScript, ua) ist die einzige mir bekannte Variante, die eine nicht-teilnehmende Gruppe mit einer leeren Gruppe gleich behandelt. –

Verwandte Themen