gpt4 book ai didi

Python的re库的sub方法 "eating"捕获组

转载 作者:行者123 更新时间:2023-11-30 23:02:30 25 4
gpt4 key购买 nike

介绍性胡言乱语:

我当前的项目有点像 Lisp 解析器,而 RegEx 确实是一个奇迹,尽管它在这个特定的函数中让我有点头疼:

该函数应该做什么:

接收一个包含方程的字符串并返回它的格式,以便解析器可以实际读取它(目前,这意味着在变量、大括号和数字之间插入乘号

它实际上做了什么:

该函数成功找到了要替换的位置,但是,在返回字符串的汇编中的某个位置,它似乎丢失了 \1 槽中的原始匹配模式并挤压了一个 ~unidentified char ~ 字符(正方形,由 [] 表示,因为我无法将其粘贴到此处)。

对于为什么会发生这种情况有什么见解吗?

<小时/>

代码:

import re

def eqxFormat(eq):
vars = "x"
for i in vars:
eq = re.sub(r'%s([0-9\(])' % i, '%s*\1' %i, eq)
eq = re.sub(r'([0-9\)])%s' % i, '\1*%s' %i, eq)

eq = re.sub(r'([0-9])\(', r'\1*(', eq)
eq = re.sub(r'\)([0-9])', r')*\1', eq)
return eq

eq = "3(x+2(5-x))^3+2x^2+x(x^-1*exp(x))"

print(eqxFormat(eq))

输出:

3*(x+2*(5-x))^3+[]*x^2+x*[]x^-1*exp(x))

最佳答案

引用捕获组 r'%s*\1'r'\1*%s' 时,需要使用原始字符串 r :

  eq = re.sub(r'%s([0-9\(])' % i, r'%s*\1' %i, eq)
eq = re.sub(r'([0-9\)])%s' % i, r'\1*%s' %i, eq)

添加r后,您的代码将输出正确的字符串:

In [6]: eq = "3(x+2(5-x))^3+2x^2+x(x^-1*exp(x))"

In [7]: eqxFormat(eq)
Out[7]: '3*(x+2*(5-x))^3+2*x^2+x*(x^-1*exp(x))'

您还可以使用另一个转义反斜杠,即'%s*\\1',如果您不使用原始字符串或转义,您会得到Ctrl-A:

In [8]: "\1"
Out[8]: '\x01'
In [1]: r"\1"
Out[1]: '\\1'

关于Python的re库的sub方法 "eating"捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com