我知道模板可以像以下一样工作:
x = Template(" Coordinates; $o1;$o2;$o3;\n")
y = x.substitute(o1 = 23, o2 = 108, o3 = 655)
你会给我:
" 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()
解决方案:使用正则表达式tutorial(感谢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')]
答案 0 :(得分: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'}
答案 1 :(得分:2)
关于您的编辑,如果您希望使用正则表达式,我高度建议您查看tutorial;没有一些指导,正则表达式看起来像不可压缩的垃圾,即使其他人可以为你编写正则表达式,你至少应该明白他们在做什么。
话虽如此,
>>> 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')
答案 2 :(得分:0)
您可以做的是使用自定义模板标识符创建一个类,然后使用正则表达式从您创建的对象中标识这些标识符。您希望创建一个字典来存储这些标识符值对,然后在unpack
等(自定义)方法中,只需给出标识符的值。