Python 正则表达式在qoutes中的键后查找字符串
输入: blalasdl8ujd“键”:“值”,blblabla asdw “alo”:“ebobo”,blabla“www”:“zzzz” 或 blalasdl8ujd键[此处的任何字符]“值”,blabla asdw “alo”:“ebobo”,bla“www”:“zzzz” 我试图提取只有Python 正则表达式在qoutes中的键后查找字符串,python,regex,Python,Regex,输入: blalasdl8ujd“键”:“值”,blblabla asdw “alo”:“ebobo”,blabla“www”:“zzzz” 或 blalasdl8ujd键[此处的任何字符]“值”,blabla asdw “alo”:“ebobo”,bla“www”:“zzzz” 我试图提取只有键的值,并且知道值包含“ 下面的regexkey.*“(.*?”返回最后一个包含“(“zzzz”)的匹配项。 我需要先把它修好再回来 您可以在键和值组之间使用非贪婪量词*?: key.*?"(.
键的值
,并且知道值
包含“
下面的regexkey.*“(.*?”
返回最后一个包含“(“zzzz”
)的匹配项。
我需要先把它修好再回来
您可以在键和值组之间使用非贪婪量词*?
:
key.*?"(.*?)"
演示
使现代化
您可能想知道为什么它会捕获冒号,:
。它抓住了这一点,因为这是引号之间的下一件事。因此,您可以在键周围添加可选引号,如下所示:
("?)key\1.*?"(.*?)"
另一个演示。您可以在键和值组之间使用非贪婪量词*?
:
key.*?"(.*?)"
演示
使现代化
您可能想知道为什么它会捕获冒号,:
。它抓住了这一点,因为这是引号之间的下一件事。因此,您可以在键周围添加可选引号,如下所示:
("?)key\1.*?"(.*?)"
另一个演示。检查以下内容:
.*(\"key\":\"(\w*)\")
使用第2组:
检查以下内容:
.*(\"key\":\"(\w*)\")
使用第2组:
代码
要匹配转义双引号的可能性,可以使用以下正则表达式:
用法
后果
输入
输出
字符串1
- 匹配:
“键”:“值”
- 捕获组1:
值
字符串2(当使用下的某个方法匹配两个字符串时)
- 匹配:
键[此处的任何字符]“值”
- 捕获组1:
值
解释
“键”
按字面意思匹配
\s*
匹配任意数量的空白字符
:
逐字匹配冒号字符
\s*
匹配任意数量的空白字符
“
逐字匹配双引号字符
([^“]*)
将集合中不存在的任何字符(双引号字符除外的任何字符)捕获任意次数到捕获组1中
“
逐字匹配双引号字符
匹配两个字符串
\b
将位置断言为单词边界
键
按字面匹配
\b
将位置断言为单词边界
(?:“\s*:\s*|.*)
匹配以下任一项
“\s*:\s*
“
逐字匹配
\s*
匹配任意数量的空白字符
:
按字面意思匹配此项
\s*
匹配任意数量的空白字符
*?
匹配任意字符任意次数,但尽可能少
“
逐字匹配
([^“]*)
将除“
以外的任意数量的字符捕获到捕获组1中
“
逐字匹配
代码
要匹配转义双引号的可能性,可以使用以下正则表达式:
用法
后果
输入
输出
字符串1
- 匹配:
“键”:“值”
- 捕获组1:
值
字符串2(当使用下的某个方法匹配两个字符串时)
- 匹配:
键[此处的任何字符]“值”
- 捕获组1:
值
解释
“键”
按字面意思匹配
\s*
匹配任意数量的空白字符
:
逐字匹配冒号字符
\s*
匹配任意数量的空白字符
“
逐字匹配双引号字符
([^“]*)
将集合中不存在的任何字符(双引号字符除外的任何字符)捕获任意次数到捕获组1中
“
逐字匹配双引号字符
匹配两个字符串
\b
将位置断言为单词边界
键
按字面匹配
\b
将位置断言为单词边界
(?:“\s*:\s*|.*)
匹配以下任一项
“\s*:\s*
“
逐字匹配
\s*
匹配任意数量的空白字符
:
按字面意思匹配此项
\s*
匹配任意数量的空白字符
*?
匹配任意字符任意次数,但尽可能少
“
逐字匹配
([^“]*)
将除“
以外的任意数量的字符捕获到捕获组1中
“
逐字匹配
可能有一种更为类似于蟒蛇的方法,但是:
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'
我的灵感来自于的优雅,但处理有报价和无报价的案例使其不仅仅是一行
您可以使用以下理解:
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
的情况,可能有一种更类似于python的方法来实现这一点,但是:
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'
我的灵感来自于的优雅,但处理有报价和无报价的案例使其不仅仅是一行
您可以使用以下理解:
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
的情况,它不会处理值中的任何转义字符。没错。但是,我看不出问题中转义字符的定义。我们是带着双份行李逃跑的吗