用于选择多行代码的Python正则表达式[duplicate]

vmjh9lq9  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(67)
    • 此问题在此处已有答案**:

(13个答案)
3小时前关门了。
我想创建一个python正则表达式,它可以选择一个完整的Terraform资源块。一个文件中有多个资源块(下面的例子),我想分别选择每个资源块。
我试过下面的正则表达式。第一个在代码中有多个右括号时会卡住。第二个只选择整个文件。

1) match = re.search(r'resource.*?\{(.*?)\}', code, re.DOTALL)
2) match = re.search(r'resource.*?\{(.*)\}', code, re.DOTALL)

样本文件:

resource "aws_s3_bucket_notification" "aws-lambda-trigger" {
  bucket = aws_s3_bucket.newbucket.id
  lambda_function {
    lambda_function_arn = aws_lambda_function.test_lambda.arn
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       =  var.prefix
    filter_suffix       =  var.suffix
  }
}
resource "aws_s3_bucket" "newbucket" {
    bucket = var.bucket_name
    force_destroy = true
    acl = var.acl_value
}
omhiaaxx

omhiaaxx1#

一般来说,你不应该使用正则表达式来解析诸如html、xml或者hcl之类的结构,而应该使用像pyhcl这样的解析器

import hcl
import json
with open("stack.tf") as main:
    obj = hcl.load(main)

print(json.dumps(obj, indent=4))

print(f'newbucket-Force-Destroy: {obj["resource"]["aws_s3_bucket"]["newbucket"]["force_destroy"]}')

然后,您可以将其全部解析到一个dict中,只需查找您感兴趣的任何值。

输出

$ python ./stack.py
{
    "resource": {
        "aws_s3_bucket_notification": {
            "aws-lambda-trigger": {
                "bucket": "aws_s3_bucket.newbucket.id",
                "lambda_function": {
                    "lambda_function_arn": "aws_lambda_function.test_lambda.arn",
                    "events": [
                        "s3:ObjectCreated:*"
                    ],
                    "filter_prefix": "var.prefix",
                    "filter_suffix": "var.suffix"
                }
            }
        },
        "aws_s3_bucket": {
            "newbucket": {
                "bucket": "var.bucket_name",
                "force_destroy": true,
                "acl": "var.acl_value"
            }
        }
    }
}

newbucket-Force-Destroy: True

相关问题