正则表达式在密钥里面找到字符串qoutes

时间:2017-12-08 17:41:56

标签: python regex

输入:

  

blalasdl8ujd“key”:“value”,blblabla asdw   “ALO”: “ebobo”,布拉布拉 “WWW”: “ZZZZ”

  

blalasdl8ujd key [any_chars_here] “value”,blabla asdw   “alo”:“ebobo”,bla“www”:“zzzz”

我想提取只有key的{​​{1}},并且知道value已涵盖"

关注正则表达式key.*"(.*?)"会返回“("zzzz")所覆盖的最后一场比赛。 我需要先修复它才能返回。

https://regex101.com/r/CDfhBT/1

4 个答案:

答案 0 :(得分:3)

代码

See regex in use here

"key"\s*:\s*"([^"]*)"

要匹配转义双引号的可能性,您可以使用以下正则表达式:

See regex in use here

"key"\s*:\s*"((?:(?<!\\)\\(?:\\{2})*"|[^"])*)"

此方法可确保在双引号字符\之前有奇数个反斜杠",以便\"\\\"\\\\\"等等。有效,但\\"\\\\"\\\\\\"无效(这只会输出一个反斜杠字符,因此双引号字符"前面会有偶数个反斜杠只是导致字符串终止。)

匹配两个字符串

如果您还希望匹配第二个字符串,则可以使用以下任一字符串:

\bkey\b(?:"\s*:\s*|.*?)"([^"]*)"
\bkey\b(?:"\s*:\s*|.*?)"((?:(?<!\\)\\(?:\\{2})*"|[^"])*)"

用法

See code in use here

import re

s = 'blahblah "key":"value","TargetCRS": "Target","TargetCRScode": "vertical Code","zzz": "aaaa" sadzxc "sss"'
r = re.compile(r'''"key"\s*:\s*"([^"]*)"''')

match = r.search(s)
if match:
    print match.group(1)

结果

输入

blahblah "key":"value","TargetCRS": "Target","TargetCRScode": "vertical Code","zzz": "aaaa" sadzxc "sss"
blalasdl8ujd key [any_chars_here] "value", blabla asdw "alo":"ebobo", bla"www":"zzzz"

输出

字符串1

  • 匹配:"key":"value"
  • 捕获组1:value

字符串2 (使用匹配两个字符串下的其中一种方法时)

  • 匹配:key [any_chars_here] "value"
  • 捕获组1:value

说明

  • "key"按字面意思匹配
  • \s*匹配任意数量的空白字符
  • :字面上匹配冒号字符
  • \s*匹配任意数量的空白字符
  • "字面上匹配双引号字符
  • ([^"]*)捕获集合中不存在的任何字符(双引号字符"以外的任何字符)任意次数进入捕获组1
  • "字面上匹配双引号字符

匹配两个字符串

  • \b断言位置为单词边界
  • key按字面意思匹配
  • \b断言位置为单词边界
  • (?:"\s*:\s*|.*?)匹配以下任一项
    • "\s*:\s*
      • "按字面意思匹配
      • \s*匹配任意数量的空白字符
      • :按字面意思匹配
      • \s*匹配任意数量的空白字符
    • .*?任意次数匹配任何字符,但尽可能少
  • "按字面意思匹配
  • ([^"]*)"以外的任意数字捕获到捕获组1
  • "按字面意思匹配

答案 1 :(得分:0)

您可以在.*?和值组之间使用非贪婪量词key

key.*?"(.*?)"

演示here

更新

您可能想知道为什么它会捕获冒号:。它捕获了因为这是引号之间的下一个事情。因此,您可以在key周围添加可选引号,如下所示:

("?)key\1.*?"(.*?)"

另一个演示here

答案 2 :(得分:0)

检查一下:

.*(\"key\":\"(\w*)\")

使用第2组:

https://regex101.com/r/66ikH3/2

答案 3 :(得分:0)

这可能是一种更为pythonic的方式,但是:

s1 = 'blalasdl8ujd "key":"value", blblabla asdw "alo":"ebobo",blabla"www":"zzzz"'
s2 = 'blalasdl8ujd key [any_chars_here] "value", blabla asdw "alo":"ebobo", bla"www":"zzzz"'


def getValue(string, keyName = 'key'):
    """Find next quoted value after a key that may or may not be quoted"""
    startKey = string.find(keyName) 
    # if key is quoted, adjust value search range to exclude its closing quote
    endKey = string.find('"',startKey) if string[startKey-1]=='"' else startKey + len(keyName) 
    startValue = string.find('"',endKey+1)+1
    return string[startValue:string.find('"',startValue+1)]

getValue(s1) #'value'
getValue(s2) #'value'

我受到了this answer优雅的启发,但处理引用和未引用的案例使其不仅仅是一线。

您可以使用以下理解:

next(y[1][1:-1] for y in [[l for l in x.split(':')] 
     for  x in s2.split(',')] if 'key' in y[0]) # returns 'value' w/o quotes

但那不会处理s2的情况。