获取字符串后的文本

2024-10-04 03:25:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找帮助,以创建一个正则表达式,可以得到一个特定的文本后,一个给定的字符串使用Python。你知道吗

我试图从一个页面中提取一个JSON,它是这样的:

    var config = {aslkdjsakljdkalsj{asdasdas}askldjaskljd};

我需要一个正则表达式,它可以从第一个{到}=>;而不需要分号

我试过用

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

但是输出是

    config = {sadasdasdas{a}asdasdasd

它获取config =部分,而不获取最后的}。你知道吗

我该怎么修?你知道吗


Tags: 字符串文本gtconfigjsonvar页面asdasdas
1条回答
网友
1楼 · 发布于 2024-10-04 03:25:07

如果JS there的行保证在终止的;之前不包含换行符,那么问题就足够简单了-匹配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的原生REs不支持递归,也有一个regex module可用。您还需要确保JSON中字符串中的{}不会影响当前的嵌套级别。对于原始字符串,需要一个

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

捕获组的外部是

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

匹配所需的行和字符串分隔符,并捕获一组

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

意思是-{,后跟任意数:或

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

这将确保{}括号被模式的结尾平衡。你知道吗


但是-上面是一个使用String.raw的示例,其中Javascript代码中的文字反斜杠表示字符串中的文字反斜杠。另一方面,使用'分隔符时,文本反斜杠需要在JS中转义,因此上面的输入如下所示

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

还需要对图案中的反斜杠进行双转义:

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

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

这很复杂。如果可能的话,我建议使用第一种方法或者是一种变体。你知道吗

相关问题 更多 >