操作找到的要rep的子字符串

2024-06-10 03:16:48 发布

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

我希望替换者取决于找到了什么。我所追求的一个例子可能是

def f(x):
    return str(int(x) + 1)

print(re.sub(r"(\d)", f(r"\1"), "123"))

#print 234

然而,这当然不起作用。有没有什么方法可以做到我想要的,而不必跟踪找到的字符串的位置/长度,然后在下一行替换它?我正在寻找一种一次性的方法。你知道吗


请注意,我正在研究的实际示例并不是那么简单。我在做一个函数来解释一个数学计算字符串输入。你知道吗

例如“2+4*6/3”

该函数的思想是将“4*6”替换为24,然后将“24/3”替换为8,最后将“2+8”替换为10。它将搜索适当的对,并使用regex跟踪BIDMAS。你知道吗


Tags: 方法函数字符串re示例returndef例子
2条回答

也许这太简单了,但您可以通过先在乘法上应用正则表达式,然后在加法运算符上应用正则表达式,然后使用替换函数来构建一些简单的计算器:

import re

s = "4 + 6 * 7"

def replfunc(m):
    a = int(m.group(1))
    b = int(m.group(3))
    op = m.group(2)
    if op=="*":
        return str(a*b)
    elif op=="+":
        return str(a+b)

for op in "*+":
    s = re.sub("(\d+)\s*({})\s*(\d+)".format(re.escape(op)),replfunc,s)

在这里,regex尝试匹配“number operator number”(中间有可选空格),并在match上调用替换函数。你知道吗

replacement函数的作用是一致的,转换为整数,形成相关的操作,并返回一个要替换的字符串。你知道吗

当然,这不是为处理带括号的表达式而设计的,也永远不会是这样,请考虑第三方求值器,例如simpleeval(在pypi中搜索会得到几十个结果)

我知道这不是你想要的方法,但是你考虑过使用eval()函数吗?你知道吗

>>> statement = input("Expression: ")
3 + 4 * (5 + 2)
>>> eval(statement)
31

这当然比使用RegEx容易。你知道吗

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski

相关问题 更多 >