Python 单个正则表达式中的几个替换
我正在尝试从文件中读取一组数据,以便将其转换为Python 单个正则表达式中的几个替换,python,regex,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.s
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(),
但这并不完全是可读的,或者说是理智的。有没有一种方法可以使用一个正则表达式来进行替换?似乎您完全可以不使用正则表达式:
line='0.2741564350068515+2.6100840481550604*^-10*I\n'
print("({})".format(line.strip().replace("*^", "e").replace("*I", "j")))
# => (0.2741564350068515+2.6100840481550604e-10j)
见
一个“有趣”的例子,展示了如何使用捕获组并检查用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次。使用regex执行此操作的最简单方法是创建一个与整数匹配的模式,并捕获捕获组中的所有重要部分:
(.*?)\*\^(.*?)\*I
这将在第1组中捕获0.2741564350068515+2.6100840481550604
,在第2组中捕获10
,因此用(\1e\2j)
替换将得到预期结果:
(0.2741564350068515+2.6100840481550604e-10j)
re.sub(“(^)”,“(”,line)
是一部杰作:)。至少,你可以只写”(“+line
”。顺便说一句,如果你替换文字,为什么要使用正则表达式呢?事实上:除了我尝试学习正则表达式之外,没有其他具体的原因。如果我能只使用一个re.sub,那就不会那么尴尬了。”(“+line.replace(r'*^',e')。replace('*I',J')。replace('\n','))
也许就足够了?我一直在想re.sub(“^(.*)$”,“^\(\1\)$”
中的括号,但我似乎无法重现匹配的*
。还有希望吗?