在python中扩展字符串模板类用于简单正则表达式

2024-09-28 03:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢python的一切,主要是因为它的简单。我觉得正则表达式已经让我远离了对python的热爱。因此,我想扩展已经存在的字符串模板类,它允许我在字符串中设置变量,以便可以获取已存在字符串的值。在

我的第一次尝试效果不错,但也有一些缺点:

import re
from string import Template
class TemplateX(Template):
    def getvalues(self,Str):
        regex = r""
        skipnext = False
        for i in self.template:
            if skipnext == False:
                if i != "$":
                    regex += i
                else:
                    regex += r"(.+)"
                    skipnext = True
            else:
                skipnext = False
        values = re.search(regex,Str).groups()
        return values

temp = TemplateX("  Coords;     $x;$y;$z;\n")
newstring = temp.substitute(x="1",y="2",z="3")
print newstring

values = temp.getvalues(newstring)
print values

newstring打印为:“Coords;1;2;3;\n”

值打印为:(“1”,“2”,“3”)

对于这种更简单的方法,我很乐意失去re的一些功能。 我的问题是如何在getvalues中添加更多的功能,以允许TemplateX中的变量超过1个字符(比如Template类和substitute allows)。i、 e.因此,这项工作:

^{pr2}$

Tags: 字符串importselfrefalseiftemplatetemp
2条回答

你很想把一个模板变成一个正则表达式来读取这个模板,对吧?这并不总是可行的,例如,如果你有一个模板"$x$y"和一个字符串"abc",你就不知道它是("ab", "c")("abc", "")还是其他情况。不仅仅是模板变量彼此相邻。在

所以,如果你想要这样的东西,你必须知道你输入的字符串中有什么。也就是说,变量之间有一些字符,这些字符不会出现在变量本身中(即变量都是数字,模板中它们之间有分号)。如果您只是解析一些输入,那么如果您只编写自己的regex可能会更安全。在

也就是说,你可以这样做:

class TemplateX(Template):
    def getvalues(self,Str):
        """ Reads a string matching the template to find the original values.

            >>> temp = TemplateX("Blah: $xx;$y;")
            >>> newsting = temp.substitute(xx="1",y="2")
            >>> temp.getvalues(newstring)
            ('1', '2')

        """
        regex = re.sub(self.pattern, "(.*)", self.template)
        m = re.match(regex, Str)
        return m.groups()

它使用模板自己的机制来查找占位符,并用正则表达式通配符替换它们。然后在给定的字符串上运行regex。在

您还可以尝试获取初始关键字参数:

^{pr2}$

然后用:

temp = TemplateX("$a$a")
newstring = temp.substitute(a='a')
print temp.getvalues(newstring)

相关问题 更多 >

    热门问题