捕获转义引号内的字符串

时间:2019-10-23 17:57:13

标签: python regex presto

我有3种这种格式的字符串

Bank: {"955974044748481":["BANK_A"]}
{"reason": "Bank: {"455049295219902":["BANK_B"]}"}
{"reason": "Bank: {\\"1876212592475597\\":[\\"BANK_C\\"]}"}

我需要使用presto SQL语句中的单个正则表达式从这些字符串中提取bank_idbank_name

我尝试过此正则表达式,但它仅捕获前两个,而不捕获具有转义字符的最后一个。 https://regex101.com/r/ejW68x/1

Bank: {"(.*)":\["(.*)"\]}

捕获所有3个变体的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

怎么样呢?

Bank:.*{(?:\\\\)?"([^{"]*?)(?:\\\\)?":\[(?:\\\\)?"(.*?)(?:\\\\)?"\]}

Demo

或确保\\仅成对匹配

Bank:.*{((?:\\\\)?)"([^{"]*?)\1":\[((?:\\\\)?)"(.*?)\3"\]}

Demo

请注意,在第二种情况下,您的捕获将在#2和#4组中。


更新:

您的新测试字符串仍将与上述模式匹配。如果愿意,您可以将Bank:.*替换为Bank:[ ]Demo1-Demo2

说明:(更改为样式)

  • 添加了(?:\\\\)?->一个可选的非捕获组,以匹配两个反斜杠字符。

  • 将第一个捕获组(.*)替换为([^{"]*?),以避免匹配双引号和{字符(这对于第一个测试字符串尤其必要)。另外,通过添加?将其从贪婪转换为惰性,以避免捕获转义字符(\\)(如果存在)。

  • 使第二个捕获组也变懒(.*?)出于相同的原因。

  • 在第二种模式中,(?:\\\\)?被添加到捕获组,以便可以使用反向引用(即,\1\3)。这样做的目的是仅在两个双引号字符都转义(以\\开头)时匹配。