gpt4 book ai didi

python - 获取字符串后的文本

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:23 24 4
gpt4 key购买 nike

我正在寻求帮助来创建一个正则表达式,该正则表达式可以使用 Python 在给定字符串之后获取特定文本。

我正在尝试从页面中提取 JSON,它是这样的:

    var config = {aslkdjsakljdkalsj{asdasdas}askldjaskljd};

我需要一个可以从第一个 { 到 } => 没有分号的正则表达式

我试过

    config = .*?(?=\}\;)

但是输出是

    config = {sadasdasdas{a}asdasdasd

它获取 config = 部分,但不获取最后一个 }

我该如何解决?

最佳答案

如果你的 JS 行保证在终止 ; 之前不包含换行符,那么问题很简单 - match var config =,后面是一组捕获的非换行符,然后是抹茶分号和行尾。如果 JSON 用 ' 分隔,那么,例如,使用模式

var config = '(.+)';$

并提取第一组。

input = '''
var config = '{ "foo": "b\\ar", "ba{{}}}{{z": ["buzz}", "qux", {"innerprop": "innerval"}]}';
var someOtherVar = 'bar';
'''
match = re.search("(?m)var config = '(.+)';$", input);

如果 JSON 不能保证在其自己的行上,那么它会复杂得多。解析像 JSON 这样的嵌套结构很困难——用正则表达式解决一般问题的唯一方法是结构是否事先已知(通常情况并非如此,并且可能需要模式中的大量重复代码),或者如果正在使用的 RE 引擎支持递归匹配。如果没有它,就无法在模式中表达对 平衡 数量的 {} 的需求。

幸运的是,如果您使用的是 Python,即使 Python 的原生 RE 不支持递归,也有一个 regex module可用的。您还需要确保可能出现在 JSON 中的字符串内部{} 不会影响当前的嵌套级别。对于原始字符串,您需要像这样的模式

var config = String\.raw`\K({(?:"(?:\\|\\"|[^"])*"|[^{}]|(?1))*})(?=`;)

捕获组的外面是

var config = String\.raw`\K({ ... })(?=`;)

匹配你想要的行和字符串定界符,捕获组为

{(?:"(?:\\|\\"|[^"])*"|[^{}]|(?1))*}

这意味着 - {,后跟任意数量的:任一个

  • "(?:\\|\\"|[^"])*" - 匹配 JSON 中的字符串(键或值),从其起始分隔符到其结束定界符,忽略转义的 "
  • [^{}] - 匹配任何不是 {} 的字符 - 其他字符可以忽略,因为我们只是想要获得正确的嵌套级别,或者
  • (?1) - 递归整个第一个捕获组(匹配 { ... } 的那个)

这将确保 { } 括号在模式末尾平衡。


但是 - 以上是使用 String.raw 的示例,其中 Javascript 代码中的文字反斜杠表示字符串中的文字反斜杠。另一方面,使用 ' 分隔符时,文字反斜杠需要在 JS 中进行 double 转义,因此上面的输入看起来像

var config = '{ "foo": "b\\\\ar", "ba{{}}}{{z": ["buzz}", "qux", {"innerprop": "innerval"}]}';

还需要对模式中的反斜杠进行两次转义:

var config = '\K({(?:"(?:\\\\|\\\\"|[^"])*"|[^{}]|(?1))*})(?=';)

https://regex101.com/r/8rSrGf/1

这很复杂。如果可能的话,我建议改用第一种方法或其变体。

关于python - 获取字符串后的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54015349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com