我熟悉使用Templates将变量插入字符串的能力,如下所示:
Template('value is between $min and $max').substitute(min=5, max=10)
我现在想知道的是,是否有可能做相反的事情。我想要一个字符串,并使用模板从中提取值,这样我就具有一些包含提取值的数据结构(最好只是命名变量,但是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'}
这可能吗?
最佳答案
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))
输出:
5 10
更新1.可以给组命名:
m = re.match(r'value is between (?P<min>.*) and (?P<max>.*)', string)
print(m.group('min'), m.group('max'))
但是此功能并不经常使用,因为通常在一个更重要的方面存在足够的问题:如何准确捕获所需的内容(在这种特殊情况下这没什么大不了的,但即使在这里:如果字符串是
value is between 1 and 2 and 3
怎么办-应该接受该字符串,以及min
和max
是什么?)。Update2。比起精确的正则表达式,有时更容易将正则表达式和“regular”代码结合起来,如下所示:
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
当您的文本包含许多要处理的块(例如,不同类型的引号中的短语)时,这种组合方法尤其值得记住:在棘手的情况下,定义一个正则表达式来处理定界符和块内容要比定义多个更难像
text.split()
这样的步骤,可选的块合并以及每个块的独立处理(使用正则表达式和其他方式)。关于python:从字符串模板中提取变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42536406/