Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单个正则表达式中的几个替换_Python_Regex - Fatal编程技术网

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\)$”
中的括号,但我似乎无法重现匹配的
*
。还有希望吗?