输入:
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"
)所覆盖的最后一场比赛。
我需要先修复它才能返回。
答案 0 :(得分:3)
"key"\s*:\s*"([^"]*)"
要匹配转义双引号的可能性,您可以使用以下正则表达式:
"key"\s*:\s*"((?:(?<!\\)\\(?:\\{2})*"|[^"])*)"
此方法可确保在双引号字符\
之前有奇数个反斜杠"
,以便\"
,\\\"
,\\\\\"
等等。有效,但\\"
,\\\\"
,\\\\\\"
无效(这只会输出一个反斜杠字符,因此双引号字符"
前面会有偶数个反斜杠只是导致字符串终止。)
如果您还希望匹配第二个字符串,则可以使用以下任一字符串:
\bkey\b(?:"\s*:\s*|.*?)"([^"]*)"
\bkey\b(?:"\s*:\s*|.*?)"((?:(?<!\\)\\(?:\\{2})*"|[^"])*)"
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"
value
字符串2 (使用匹配两个字符串下的其中一种方法时)
key [any_chars_here] "value"
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)
答案 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
的情况。