单个正则表达式中的几个替换

时间:2016-05-17 12:07:54

标签: python regex

我正在尝试从文件中读取一组数据,以便将其强制转换为complex。条目的格式为

line='0.2741564350068515+2.6100840481550604*^-10*I\n',

应该呈现为

'(0.2741564350068515+2.6100840481550604e-10j)'.

因此我需要插入一对圆括号并更改虚数单位和指数表示法的符号。我笨拙的解决方案是单独执行每次替换,

re.sub("\*\^","e",re.sub("[\.]{0,1}\*I","j)",re.sub("(^)","(",line))).strip(),

但这不是完全可读或理智。有没有办法使用单个正则表达式进行替换?

2 个答案:

答案 0 :(得分:2)

似乎你可以完全没有正则表达式:

line='0.2741564350068515+2.6100840481550604*^-10*I\n'
print("({})".format(line.strip().replace("*^", "e").replace("*I", "j")))
# => (0.2741564350068515+2.6100840481550604e-10j)

请参阅IDEONE demo

一个“有趣的”regex way,显示如何使用捕获组并检查替换为lambda时捕获的内容:

import re
line='0.2741564350068515+2.6100840481550604*^-10*I\n'
print("({})".format(re.sub(r"(\*\^)|([.]?\*I)", lambda m: "e" if m.group(1) else "j", line.strip())))
# => (0.2741564350068515+2.6100840481550604e-10j)

如果第1组((\*\^))匹配,我们将替换为e,如果第2组匹配,则替换为j

请注意,{0,1}限制量词意味着与?量词相同 - 1或0次。

答案 1 :(得分:0)

使用正则表达式执行此操作的最简单方法是创建一个与整数匹配的模式,并捕获捕获组中的所有重要部分:

(.*?)\*\^(.*?)\*I

这会捕获第1组中的0.2741564350068515+2.6100840481550604和第2组中的10,因此用(\1e\2j)替换将获得预期结果:

(0.2741564350068515+2.6100840481550604e-10j)