Python中string.Template的相反是什么?

3

我知道模板可以像以下方式工作:

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"]

有什么想法吗?我应该使用正则表达式吗?

编辑:如果使用正则表达式,如何编写代码以返回前面的第一个数字和后面的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):

>>> import re
>>> text = """
       123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4
        17;  Coord   ;  15.2940;  13.5010;  3; 1; 8; 8
         5;  Coord   ;  19.1345;   0.6200;  1; 1; 7; 8
    """
>>> coord = re.compile("\D*(\d+)\D+([\d\.]+)\D+([\d\.]+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)")
>>> coord.findall(text)
[('123','19.1335','3.5010','1','3','8','4'),('17','15.2940','13.5010','3','1','8','8'),('5','19.1345','0.6200','1','1','7','8')]

4
正则表达式与字符串模板相反。 - ThibThib
3个回答

5
>>> import re
>>> y="  Coordinates;     23;108;655;\n"
>>> re.match("  Coordinates;     (\d+);(\d+);(\d+);\n", y).groups()
('23', '108', '655')

你也可以这样做,以得到值的字典。
>>> re.match("  Coordinates;     (?P<o1>\d+);(?P<o2>\d+);(?P<o3>\d+);\n", y).groupdict()
{'o3': '655', 'o2': '108', 'o1': '23'}

非常好的回答,你能帮我修改一下吗?我对正则表达式还不太熟悉,似乎无法使其工作...我认为这可能与不可预测的空格有关。 - Symon

2
关于您的编辑,如果您想使用正则表达式进行工作,我强烈建议查看教程;没有一些指导,正则表达式看起来像是无法压缩的垃圾,即使其他人可以为您编写正则表达式,您至少应该了解它们在做什么。
话虽如此,
>>> 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')

那看起来真的很糟糕哈哈..我要去读教程了,谢谢提供链接。 - Symon
1
这可能更容易阅读,它查找非数字,后跟数字,后跟非数字,后跟数字,后跟非数字,后跟数字等等... - ironchefpython
它看起来是这样的,但实际上返回的是('123','19','1335','3','5010','1','3')。 - Symon
抱歉,我从解释器复制时打错了一个字...现在请再试一次。 - ironchefpython
非常优秀,感谢您的帮助。正则表达式非常复杂,看来我需要一段时间阅读这份教程 :) - Symon

0
你可以创建一个带有自定义模板标识符的类,然后使用正则表达式从创建的对象中识别这些标识符。你想创建一个字典来存储这些标识符值对,然后在你的 (自定义) 方法中,如 unpack,只需提供这些标识符的值即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接