Python中string.Template的反面

Python中string.Template的反面,python,regex,string,templates,Python,Regex,String,Templates,我知道模板的工作原理如下: x = Template(" Coordinates; $o1;$o2;$o3;\n") y = x.substitute(o1 = 23, o2 = 108, o3 = 655) y会给我: " Coordinates; 23;108;655;\n" 我想知道是否有一种方法可以做相反的事情?比如我的化妆包: x = Template(" Coordinates; $o1;$o2;$o3;\n") y = " Coordinates

我知道模板的工作原理如下:

x = Template("  Coordinates;     $o1;$o2;$o3;\n")
y = x.substitute(o1 = 23, o2 = 108, o3 = 655)
y会给我:

"  Coordinates;     23;108;655;\n"
我想知道是否有一种方法可以做相反的事情?比如我的化妆包:

x = Template("  Coordinates;     $o1;$o2;$o3;\n")
y = "  Coordinates;     23;108;655;\n"
z = x.unpack(y)
让z返回类似于:

["23","108","655"]
有什么想法吗?我应该改用正则表达式吗

编辑:如果使用正则表达式,我将如何为以下3行编程以返回第一个数字和后面的6个数字

   a = "   123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4"
   b = "    17;  Coord   ;  15.2940;  13.5010;  3; 1; 8; 8"
   c = "     5;  Coord   ;  19.1345;   0.6200;  1; 1; 7; 8"
我试过这些,但似乎无法让它工作:

>>> re.match('(\d+);  Coord   ;(\d+);(\d+);(\d+);(\d+);(\d+);(\d+)',a).groups()
解决方案:使用正则表达式(感谢ironchefpython):

您也可以这样做以获得值的dict

>>> re.match("  Coordinates;     (?P<o1>\d+);(?P<o2>\d+);(?P<o3>\d+);\n", y).groupdict()
{'o3': '655', 'o2': '108', 'o1': '23'}
重新匹配(“坐标;(?P\d+);(?P\d+);(?P\d+);\n“,y).groupdict() {'o3':'655','o2':'108','o1':'23'}
关于您的编辑,如果您希望使用正则表达式,我高度推荐;如果没有一些指导,正则表达式看起来就像不可压缩的垃圾,即使其他人可以为您编写正则表达式,您至少应该了解他们在做什么

尽管如此

>>> re.match(r"\D*(\d+)\D+([\d\.]+)\D+([\d\.]+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)", 
             "   123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4").groups()
('123', '19.1335', '3.5010', '1', '3', '8', '4')

您可以使用自定义模板标识符创建一个类,然后使用正则表达式从您创建的对象中标识这些标识符。您希望创建一个字典来存储这些标识符-值对,然后在您的(自定义)方法中,例如
unpack
,只需给出标识符的值。

正则表达式与字符串模板相反cellent answer,您能帮我编辑吗?我对正则表达式非常陌生,似乎无法使它工作。。我认为这与不可预测的空白有关。这看起来确实像垃圾哈哈。。我要开始阅读教程了,谢谢你的链接。这可能更容易阅读,它会查找not数字,后跟数字,后跟not数字,后跟数字,后跟not数字,后跟数字,等等……它是,但它实际返回了('123','19','1335','3','5010','1','3'),抱歉,我从口译员那里抄的时候打错了。。。现在就试试。太好了,谢谢你的帮助。。正则表达式非常复杂,看起来我要读一段时间了:)
>>> re.match("  Coordinates;     (?P<o1>\d+);(?P<o2>\d+);(?P<o3>\d+);\n", y).groupdict()
{'o3': '655', 'o2': '108', 'o1': '23'}
>>> re.match(r"\D*(\d+)\D+([\d\.]+)\D+([\d\.]+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)", 
             "   123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4").groups()
('123', '19.1335', '3.5010', '1', '3', '8', '4')