【问题标题】:Python: read regexps from JSONPython:从 JSON 读取正则表达式
【发布时间】:2017-01-20 04:32:54
【问题描述】:

我有一个存储映射的 JSON 文件,其中包含正则表达式,如下所示:

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

为了符合我对反斜杠进行转义的标准,实际的正则表达式应该包含\d\w\\1

一旦我使用 json.load() 读取了这个 JSON,我仍然需要对结果字典进行后处理以获得正确的正则表达式。我需要用\ 替换\\。最好的方法是什么?

到目前为止,我尝试了re.sub()str.replace(),在这两种情况下,都不清楚如何在变电站中表示单个反斜杠。

例如,我不明白为什么以下内容不会产生单个反斜杠:

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

【问题讨论】:

  • 确实产生一个反斜杠。这就是它的显示方式,为了明确它是一个文字反斜杠而不是转义字符

标签: python json regex python-2.7


【解决方案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?

【讨论】:

  • 有道理,我仍然有使这些正则表达式工作的问题。例如:In [24]: re.sub("F(\\d)", "field-\\\\1", "F1") Out[24]: 'field-\\1'
  • @NikolayDerkach 这似乎完全按照它应该的方式工作。该调用解析为“在字符串"F1" 中,将所有出现的"F" 替换为"field",后跟一个反斜杠,后跟"1"”。这就是它的作用。中间参数被转义一次,所以re 看到两个反斜杠,它再次转义以产生一个反斜杠。如果您要引用第 1 组,那就是 `"field-\\1"。
  • @NikolayDerkach 在 python 中执行正则表达式的提示:使用原始字符串。如果您将r 放在字符串文字的第一个引号之前,则反斜杠不会转义任何内容(结束引号除外)。 r"\n" 是一个包含两个字符、一个反斜杠和一个 n 的字符串,相当于 "\\n"。在使用正则表达式和其他需要发送转义序列的东西时,它们非常有帮助。我正在将其编辑为答案。
  • 有道理,不知何故我认为组匹配正则表达式是\\1 而不是\1
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
相关资源
最近更新 更多