I-Eingang haben, der wie eine Liste von Argumenten aus:Parsing einfache oder doppelte Anführungszeichen und Escape-Zeichen erlauben mit regulären Ausdrücken (in Python)
input1 = '''
title="My First Blog" author='John Doe'
'''
Die Werte können jedoch durch einfache oder doppelte Anführungszeichen gesetzt werden,
input2 = '''
title='John\'s First Blog' author="John Doe"
'''
gibt es eine Möglichkeit reguläre Ausdrücke zu verwenden, um die Schlüssel-Wert-Paare Anteil von entweder einfachen oder doppelten Anführungszeichen zu extrahieren und zu entkommen Zitate:, flüchtet auch erlaubt?
Python, kann ich den folgenden regulären Ausdruck verwenden und die nicht entgangen Zitate handhaben:
rex = r"(\w+)\=(?P<quote>['\"])(.*?)(?P=quote)"
Die Renditen sind dann:
import re
re.findall(rex, input1)
[('title', '"', 'My First Blog'), ('author', "'", 'John Doe')]
und
import re
re.findall(rex, input2)
[('title', "'", 'John'), ('author', '"', 'John Doe')]
Die Letzteres ist falsch. Ich kann nicht herausfinden, wie man mit gematchten Zitaten umgeht - vermutlich im (. *?) Abschnitt. Ich habe mit der Lösung in den veröffentlichten Antworten auf Python regex to match text in single quotes, ignoring escaped quotes (and tabs/newlines) vergebens gearbeitet.
Technisch gesehen brauche ich findall nicht, um das Anführungszeichen zurückzugeben - eher nur die Schlüssel/Wert-Paare - aber das wird leicht gehandhabt.
Jede Hilfe wäre willkommen! Vielen Dank!
Könnten Sie bitte den „oder jedes andere Zeichen“ Teil erklären? Hat ein '.' in einem' oder' nicht immer Übereinstimmung? –
@LevLevitsky: Der Punkt entspricht einem beliebigen Zeichen, ja.Aber die vorherige Lookahead-Assertion '(?! \ 2)' stellt sicher, dass es sich nicht um das schließende Zitat handelt, so dass dieser Punkt tatsächlich mit jedem Zeichen übereinstimmt, außer dem Schlusskurs. –
@LevLevitsky: Aber Sie hatten absolut Recht, es gab einen großen Fehler in meiner Regex. Fixing es jetzt (der Umfang der Abwechslung war falsch). Danke, dass du mich darauf hingewiesen hast! –