【问题标题】:How to make a "Regular Expression Template" that gets values in between certain places. Python 3如何制作在某些地方之间获取值的“正则表达式模板”。蟒蛇 3
【发布时间】:2016-02-21 03:09:20
【问题描述】:

我正在询问如何使用正则表达式反向制作类似于Python Template 的东西。二次方的模板如下所示:

("${a}x^2+${b}x+${c}")

怎样才能扭转这一点,使其取而代之的是一根绳子并拉出a,b,c。

这个问题背后的原因是我最近试图执行任务以获得 ab 像这样:

    a = []
    for character in self.text:
        if re.search("\d", character):
          a.append(character)
        else:
            break
    b = re.search('%s(.*)%s' % ("\d*[\w][\^]2[+-]", "\w[+-]"), self.text).group(1)


    return a, b

它工作得很好,但它不是很pythonic,而且很麻烦。我相信有更好的方法。

【问题讨论】:

    标签: python regex python-3.x templates


    【解决方案1】:

    这是我认为您所要求的一个可能的开始——它使用正则表达式来梳理二次常数:

    import re
    
    EXAMPLES = [
        "6x^2",
        "5x",
        "4",
        "x^2 - 3x - 4",
        "6x^2 + 11x - 35",
        "x^2 - 7x",
        "2x^2 + 5x + 3",
        "5x - 3",
        "x^2 - 3",
    ]
    
    QUADRATIC_PATTERN = r"(?:(\d*)[a-z]\^2)?" r"(?:\s*[-+]\s*)?" r"(?:(\d*)[a-z])?" r"(?:\s*[-+]\s*)?" r"(\d*)?"
    
    for equation in EXAMPLES:
        matchobj = re.search(QUADRATIC_PATTERN, equation)
    
        if (matchobj):
            print(equation, ": a =", matchobj.group(1), "b =", matchobj.group(2), "c =", matchobj.group(3))
        else:
            print("misread equation:", equation)
    

    QUADRATIC_PATTERN 被定义为 Python 将连接成一个字符串的一系列原始字符串——这使得开发和调试更容易。请参阅 re.VERBOSE 了解不同/更好的方法。

    以上产生:

    6x^2 : a = 6 b = None c = 
    5x : a = None b = 5 c = 
    4 : a = None b = None c = 4
    x^2 - 3x - 4 : a =  b = 3 c = 4
    6x^2 + 11x - 35 : a = 6 b = 11 c = 35
    x^2 - 7x : a =  b = 7 c = 
    2x^2 + 5x + 3 : a = 2 b = 5 c = 3
    5x - 3 : a = None b = 5 c = 3
    x^2 - 3 : a =  b = None c = 3
    

    其中None 表示该术语不存在,空结果表示该术语存在但未给出常数。

    【讨论】:

    • 完美答案!谢谢!
    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2021-12-08
    • 2022-07-06
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多