我有一个JSON文件,我存储了一个映射,其中包含正则表达式,如下所示:
"F(\\d)": "field-\\\\1",
"FLR[ ]*(\\w)": "floor-\\\\1",
为符合标准我逃避反斜杠,实际的正则表达式应该包含\d
,\w
和\\1
。
一旦我用json.load()读取这个JSON,我仍然需要对生成的字典进行后期处理以获得正确的regexp。我需要用\\
替换\
。最好的方法是什么?
到目前为止,我尝试了re.sub()
和str.replace()
,在这两种情况下,都不清楚如何在变电站中表示单个反斜杠。
例如,我不明白为什么以下内容不会产生单个反斜杠:
In [76]: "\\\\d".replace("\\\\", "\\")
Out[76]: '\\d'
答案 0 :(得分:1)
它确实产生一个反斜杠 - 反斜杠在显示时被转义。这样做是为了使没有非转义方式显示它们的字符仍然可以明确地打印出来 - 否则,你不会知道反斜杠是否意味着是否逃避了后面的字符。
这可以通过检查单个字符来证明:
# 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
在python中进行正则表达式的一个技巧:使用原始字符串。如果在字符串文字的第一个引号之前放置r
,则反斜杠不会转义任何内容(结尾引号除外)。 r"\n"
是一个包含两个字符的字符串,\
和n
,相当于"\\n"
。使用正则表达式和其他需要发送转义序列的东西时,它们非常有用。另见:What exactly do “u” and “r” string flags do in Python, and what are raw string literals?