2016-09-12 3 views
1

ich eine JSON-Datei, wo ich eine Abbildung speichern, die regulären Ausdrücke, wie die unten enthält:Python: lesen regexps von JSON

"F(\\d)": "field-\\\\1", 
"FLR[ ]*(\\w)": "floor-\\\\1", 

mit dem Standard ich die Schrägstriche entkommen entsprechen, tatsächlich die Regexps sollte enthalten \d, \w und \\1.

Sobald ich dieses JSON mit json.load() gelesen habe, muss ich noch das resultierende Wörterbuch nachbearbeiten, um korrekte regexps zu erhalten. Ich muss eine \\ durch \ ersetzen. Was ist der beste Weg dazu?

Bisher habe ich sowohl re.sub() als auch str.replace() versucht und in beiden Fällen ist es nicht klar, wie man einen einzelnen Backslash in der Unterstation darstellt.

Zum Beispiel, ich verstehe nicht, warum die folgenden nicht einen einzigen Backslash produziert:

In [76]: "\\\\d".replace("\\\\", "\\") 
Out[76]: '\\d' 
+1

Es * erzeugt * einen einzelnen Backslash. Das ist nur, wie es angezeigt wird, um es klar zu machen, es ist ein literaler Backslash nicht ein Escape-Zeichen – jonrsharpe

Antwort

1

es einen einzelnen Schrägstrich produziert - das Backslash geschützt wird, wenn angezeigt. Dies geschieht, damit Zeichen ohne eine nicht-maskierte Möglichkeit, sie anzuzeigen, immer noch eindeutig gedruckt werden können - andernfalls wüssten Sie nicht, ob ein Backslash das folgende Zeichen umgehen soll oder nicht.

Dies kann durch Überprüfung der einzelnen Zeichen gezeigt werden:

# In a terminal/REPL: 
>>>> "\\\\d".replace("\\\\", "\\")[0] 
'\\' 
>>>> "\\\\d".replace("\\\\", "\\")[1] 
'd' 
>>>> "\\\\d".replace("\\\\", "\\")[2] 
'd' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: string index out of range 

Ein Tipp für reguläre Ausdrücke in Python zu tun: Verwenden Sie rohe Strings. Wenn Sie ein r vor dem ersten Zitat eines Zeichenfolgenliterals setzen, werden Backslashes nichts (außer einem Endzitat) entgehen. r"\n" ist eine Zeichenfolge, die zwei Zeichen enthält, eine \ und eine n, die "\\n" entspricht. Bei der Arbeit mit Regexes und anderen Dingen, an die Sie Escape-Sequenzen senden müssen, sind sie sehr hilfreich. Siehe auch: What exactly do “u” and “r” string flags do in Python, and what are raw string literals?

+0

Macht Sinn, ich habe immer noch das Problem, dass diese Regexes arbeiten. Zum Beispiel: 'In [24]: re (" F (\\ d) "," Feld - \\\\ 1 "," F1 ") Out [24]: 'field - \\ 1'' –

+0

@NikolayDerkach Das scheint genau so zu funktionieren, wie es sollte. Dieser Aufruf löst "in der Zeichenfolge" "F1" auf, ersetzt alle Vorkommen von "F" gefolgt von einer einzelnen Ziffer mit "field" gefolgt von einem umgekehrten Schrägstrich gefolgt von "1". Und das ist es. Das mittlere Argument wird einmal maskiert, so dass "re" zwei umgekehrte Schrägstriche sieht, die wieder entkoppelt werden, um einen umgekehrten Schrägstrich zu erzeugen. Wenn Sie sich auf Gruppe 1 beziehen wollten, wäre das "" -Feld - \\ 1 ". –

+0

@NikolayDerkach Ein Tipp für die Regexes in Python: Verwenden Sie rohe Strings. Wenn Sie vor dem ersten Zitat eines String-Literals ein 'r 'setzen, werden Backslashes nicht zurückgenommen (mit Ausnahme eines Endzitats). 'r" \ n "' ist eine Zeichenkette, die zwei Zeichen enthält, einen umgekehrten Schrägstrich und ein n, äquivalent zu '" \\ n "'. Bei der Arbeit mit Regexes und anderen Dingen, an die Sie Escape-Sequenzen senden müssen, sind sie sehr hilfreich. Ich bearbeite das in der Antwort. –