python:从字符串模板中提取变量

ewo*_*wok 8 python string-formatting

我熟悉使用模板将变量插入字符串的功能,如下所示:

Template('value is between $min and $max').substitute(min=5, max=10)
Run Code Online (Sandbox Code Playgroud)

我现在想知道的是,是否可以反过来.我想取一个字符串,并使用模板从中提取值,以便我有一些包含提取值的数据结构(最好只是命名变量,但dict很好).例如:

>>> string = 'value is between 5 and 10'
>>> d = Backwards_template('value is between $min and $max').extract(string)
>>> print d
{'min': '5', 'max':'10'}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Kir*_*gin 10

这叫做正则表达式:

import re
string = 'value is between 5 and 10'
m = re.match(r'value is between (.*) and (.*)', string)
print(m.group(1), m.group(2))
Run Code Online (Sandbox Code Playgroud)

输出:

5 10
Run Code Online (Sandbox Code Playgroud)

更新1.名称可以提供给组:

m = re.match(r'value is between (?P<min>.*) and (?P<max>.*)', string)
print(m.group('min'), m.group('max'))
Run Code Online (Sandbox Code Playgroud)

但是这个功能并不经常使用,因为通常有一个更重要方面的问题:如何准确捕获你想要的东西(这个特殊情况并不是什么大问题,但即使在这里:如果字符串是value is between 1 and 2 and 3- 应该怎么办?字符串被接受,什么是minmax?).


更新2.有时更容易将正则表达式和"常规"代码组合在一起,而不是制作精确的正则表达式:

m = re.match(r'value is between (?P<min>.*) and (?P<max>.*)', string)
try:
    value_min = float(m.group('min'))
    value_max = float(m.group('max'))
except (AttributeError, ValueError):  # no match or failed conversion
    value_min = None
    value_max = None
Run Code Online (Sandbox Code Playgroud)

当你的文本包含许多要处理的块(如不同类型的引号中的短语)时,这种组合方法尤其值得记住:在棘手的情况下,定义单个正则表达式以处理块的分隔符和内容比定义几个块更难类似的步骤text.split(),可选的块合并,以及每个块的独立处理(使用正则表达式和其他方法).