繁体   English   中英

向Python字符串添加隐式乘法(*)的最佳方法?

[英]Best Way to Add Implied Multiplication (*) to a Python String?

我知道如何使用RegEx更强大的其他语言来执行此操作,但是我不确定Python。 基本上我想做的是转换

(30(5-10x))+10=20

进入

(30*(5-10x))+10=20

并且添加它也很好

(30*(5-10*x))+10=20

如果x前面有数字。

在Perl中,正则表达式看起来像

/ \w+\K (?=\() | \)\K (?=\w) | \)\K (?=\() /*/

并照顾x:

/\d\K(?=[x])/*/

如何在Python中做到最好?

我更喜欢Nate那样,例如,仅添加* ,而不是取出周围的字符只是将它们放回去。

>>> e = '(1+2)(30(5-10x))x+10=20'
>>> re.sub('(?<=\w|\))(?=\() | (?<=\))(?=\w) | (?<=\d)(?=x)', '*', e, flags=re.X)
'(1+2)*(30*(5-10*x))*x+10=20'

这三个部分分别是“ before(”“ after” )和“ digit and x之间” 也许可以合并,但是之后我们可能合并太多,因此我发现这种方式更清晰,更安全。

您可以为您的示例执行此操作,并根据需要将其相应地调整为适用于(x+2)10类的字符串:

import re

s = '(30(5-10x))+10=20'

r = re.sub(r'(\d)([(a-zA-Z])', r'\1*\2', s)

print(r)   # Prints (30*(5-10*x))+10=20

简短说明
捕获组\\1\\2替换为...相同的捕获组,并在它们之间加了一个*

(通过@shashank进行代码改进)

我只尝试翻译您的正则表达式,使它们不使用\\K

您也可以通过匹配前面的字符并在替换中将它们用作后向引用来实现。

/ \w+\K (?=\() | \)\K (?=\w) | \)\K (?=\() /*/

becomes 

re.sub(r'(\w+(?=\()|\)(?=\w)|\)(?=\())', r'\\1*', original )

并照顾x:

/\d\K(?=[x])/*/

变成

re.sub(r'(\d(?=[x]))', r'\\1*', original)

注意事项:

  • 我删除了空格,我想您为了清楚起见添加了空格。
  • 我认为您的perl正则表达式不够具体。 例如,它将sin(x)转换为sin*(x)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM