gpt4 book ai didi

python - 捕获属性名称

转载 作者:行者123 更新时间:2023-11-28 17:03:58 24 4
gpt4 key购买 nike

我正在扫描“.twig”(PHP 模板)文件并 try catch 对象的属性名称。

twig 文件包含如下行(字符串):

{{ product.id }}
{{ product.parentProductId }}
{{ product.countdown.startDate | date('Y/m/d H:i:s') }}
{{ product.countdown.endDate | date('Y/m/d H:i:s') }}
{{ product.countdown.expireDate | date('Y/m/d H:i:s') }}
{{ product.primaryImage.originalUrl }}
{{ product.image(1).originalUrl }}
{{ product.image(1).thumbUrl }}
{{ product.priceWithTax(preferences.default_currency) | money }}

我要捕捉的东西是:

.id
.parentProductId
.countdown
.startDate
.endDate
.expireDate
.primaryImage
.originalUrl
.image(1)
.originalUrl
.thumbUrl
.priceWithTax(preferences.default_currency)

基本上,我试图找出 product 对象的属性。我有以下模式,但它不捕获链式属性。例如,

“{{.+?product(\.[a-zA-Z]+(?:\(.+?\)){,1})++.+?}}” 只捕获 .startDate,但它应该分别捕获 .countdown.startDate。这是不可能的,还是我遗漏了什么?

regex101

我可以捕获 ("{{.+?product((?:\.[a-zA-Z]+(?:\(.+?\)){,1})+)。 +?}}") 将它作为一个整体 (.countdown.startDate) 然后检查/拆分它,但这听起来很麻烦。

最佳答案

如果你想用一个正则表达式来处理它,你可能想使用 PyPi regex 模块:

import regex

s = """{{ product.id }}
{{ product.parentProductId }}
{{ product.countdown.startDate | date('Y/m/d H:i:s') }}
{{ product.primaryImage.originalUrl }}
{{ product.image(1).originalUrl }}
{{ product.priceWithTax(preferences.default_currency) | money }}"""

rx = r'{{[^{}]*product(\.[a-zA-Z]+(?:\([^()]+\))?)*[^{}]*}}'

l = [m.captures(1) for m in regex.finditer(rx, s)]

print([item for sublist in l for item in sublist])
# => ['.id', '.parentProductId', '.countdown', '.startDate', '.primaryImage', '.originalUrl', '.image(1)', '.originalUrl', '.priceWithTax(preferences.default_currency)']

参见 Python demo

{{[^{}]*product(\.[a-zA-Z]+(?:\([^()]+\))?)*[^{}]* }} 正则表达式将匹配

  • {{ - {{ 子串
  • [^{}]* - 除了 {}
  • 之外的 0+ 个字符
  • product - 子串 product
  • (\.[a-zA-Z]+(?:\([^()]+\))?)* - 捕获第 1 组:零个或多个序列
    • \. - 一个点
    • [a-zA-Z]+ - 1+ 个 ASCII 字母
    • (?:\([^()]+\))? - ( 的可选序列,除 () 然后是 )
  • [^{}]* - 除了 {}
  • 之外的 0+ 个字符
  • }} - }} 子字符串。

如果您仅限于 re,您需要将所有属性捕获到 1 个捕获组中(包装此 (\.[a-zA-Z]+(?:\([^()]+\))?)*(...)) 然后运行基于正则表达式的后处理以按 拆分。 不在括号内:

import re
rx = r'{{[^{}]*product((?:\.[a-zA-Z]+(?:\([^()]+\))?)*)[^{}]*}}'
l = re.findall(rx, s)
res = []
for m in l:
res.extend([".{}".format(n) for n in filter(None, re.split(r'\.(?![^()]*\))', m))])
print(res)
# => ['.id', '.parentProductId', '.countdown', '.startDate', '.primaryImage', '.originalUrl', '.image(1)', '.originalUrl', '.priceWithTax(preferences.default_currency)']

参见 this Python demo

关于python - 捕获属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460299/

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