【问题标题】:The opposite of string.Template in Python与 Python 中的 string.Template 相反
【发布时间】:2011-06-17 20:53:19
【问题描述】:

我知道模板可以像下面这样工作:

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')]

【问题讨论】:

  • 正则表达式与字符串模板相反

标签: python regex string templates


【解决方案1】:
>>> 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'}

【讨论】:

  • 很好的答案,你能帮我编辑一下吗?我对正则表达式很陌生,似乎无法让它工作..我认为这与不可预测的空白有关。
【解决方案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')

【讨论】:

  • 看起来确实像垃圾哈哈..我要去阅读教程了,谢谢你的链接。
  • 这可能更容易阅读,它会查找非数字,然后是数字,然后是非数字,然后是数字,然后是非数字,然后是数字,等等。 ...
  • 是但实际上返回了 ('123', '19', '1335',​​ '3', '5010', '1', '3')
  • 对不起,我从解释器复制时打错了...现在试试吧。
  • 太好了,谢谢你的帮助。。正则表达式相当复杂,看来我会读这个 tut 一段时间:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 2011-05-18
    • 2011-07-07
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多