Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式在qoutes中的键后查找字符串_Python_Regex - Fatal编程技术网

Python 正则表达式在qoutes中的键后查找字符串

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.*?"(.

输入:

blalasdl8ujd“键”:“值”,blblabla asdw “alo”:“ebobo”,blabla“www”:“zzzz”

blalasdl8ujd键[此处的任何字符]“值”,blabla asdw “alo”:“ebobo”,bla“www”:“zzzz”

我试图提取只有
键的
,并且知道
包含

下面的regex
key.*“(.*?”
返回最后一个包含“(
“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

的情况,它不会处理值中的任何转义字符。没错。但是,我看不出问题中转义字符的定义。我们是带着双份行李逃跑的吗