有没有一种简单的方法可以在给定格式化的 f 字符串和原始模板的情况下提取变量值?

问题描述 投票:0回答:2

假设我们有一个 f-string 风格的模板:

"{kid} ate {number} {fruit}"

以及它的格式化版本:

"Jack ate 42 apples"

我如何才能从该字符串中提取

"Jack"
"42"
"apples"
,因为它们分别匹配
kid
number
fruit
?假设 f 字符串可以是任何内容,并且包含任意数量的简单字符串或整数变量(无格式化指令),并且用于提取的字符串已经从该 f 字符串生成,因此与它完美匹配。这也意味着我不能使用正则表达式而不是 f 字符串样式格式,除非有一种方法可以在 f 字符串上生成基于正则表达式

我已经有了一些适合我的情况的东西,但它并不通用,而且对我来说有点老套。我觉得一定有更简单的东西,我就是找不到合适的词来谷歌:

template = "{kid} ate {number} {fruit}" example = "Jack ate 42 apples" extracted = {"kid": "", "number": "", "fruit": ""} for variable in extracted.keys(): extracted[variable] = example for chunk in template.split(f"{{variable}}"): extracted[variable] = extracted[variable].replace(chunk, "")
如果不可能同时变得更简单和更通用,那么具有相同通用性的更简单也很棒:)

python string pattern-matching f-string
2个回答
0
投票
您可以使用正则表达式和匹配组来执行此操作,如下所示:

    创建一个群组,名称为:
  • (?'name')
    
    
  • 无限次匹配任意字符:
  • .+
    
    
import re pattern = r"(?P<name>.+) ate (?P<number>.+) (?P<fruit>.+)" text = "John ate 3 apples" match = re.match(pattern, text) if match: name = match.group('name') number = match.group('number') fruit = match.group('fruit') print(f"{name} ate {number} {fruit}") else: print("Pattern not found in the text.")
我希望这是你想要的


0
投票
如果您可以使用外部软件包,那么这里有很棒的

parse

:

import parse template = "{kid} ate {number} {fruit}" example = template.format(kid="Jack", number=42, fruit="apples") extracted = parse.parse(template, example).named print(extracted)
    
© www.soinside.com 2019 - 2024. All rights reserved.