Jel*_*lby 7 python environment-variables
随着os.path.expandvars我可以扩大环境变量中的字符串,但需要提醒的:“格式不正确的变量名称和引用不存在的变量保持不变”(重点煤矿)。此外,os.path.expandvars扩展也逃脱\$了。
我想以类似 bash 的方式扩展变量,至少在这两点上是这样。相比:
import os.environ
import os.path
os.environ['MyVar'] = 'my_var'
if 'unknown' in os.environ:
del os.environ['unknown']
print(os.path.expandvars("$MyVar$unknown\$MyVar"))
Run Code Online (Sandbox Code Playgroud)
这给出my_var$unknown\my_var了:
unset unknown
MyVar=my_var
echo $MyVar$unknown\$MyVar
Run Code Online (Sandbox Code Playgroud)
这给出了my_var$MyVar,这就是我想要的。
小智 5
以下实现与 保持完全兼容os.path.expandvars,但通过可选参数允许更大的灵活性:
import os
import re
def expandvars(path, default=None, skip_escaped=False):
"""Expand environment variables of form $var and ${var}.
If parameter 'skip_escaped' is True, all escaped variable references
(i.e. preceded by backslashes) are skipped.
Unknown variables are set to 'default'. If 'default' is None,
they are left unchanged.
"""
def replace_var(m):
return os.environ.get(m.group(2) or m.group(1), m.group(0) if default is None else default)
reVar = (r'(?<!\\)' if skip_escaped else '') + r'\$(\w+|\{([^}]*)\})'
return re.sub(reVar, replace_var, path)
Run Code Online (Sandbox Code Playgroud)
下面是一些调用示例:
>>> expandvars("$SHELL$unknown\$SHELL")
'/bin/bash$unknown\\/bin/bash'
>>> expandvars("$SHELL$unknown\$SHELL", '')
'/bin/bash\\/bin/bash'
>>> expandvars("$SHELL$unknown\$SHELL", '', True)
'/bin/bash\\$SHELL'
Run Code Online (Sandbox Code Playgroud)
尝试这个:
re.sub('\$[A-Za-z_][A-Za-z0-9_]*', '', os.path.expandvars(path))
Run Code Online (Sandbox Code Playgroud)
正则表达式应与任何有效的变量名称匹配,按照此答案,并且每个匹配都将替换为空字符串。
编辑:如果您不想替换转义的变量(即\$VAR),请在正则表达式中使用否定的lookbehind断言:
re.sub(r'(?<!\\)\$[A-Za-z_][A-Za-z0-9_]*', '', os.path.expandvars(path))
Run Code Online (Sandbox Code Playgroud)
(这表示匹配项前面不应带有\)。
编辑2:让我们把它变成一个函数:
def expandvars2(path):
return re.sub(r'(?<!\\)\$[A-Za-z_][A-Za-z0-9_]*', '', os.path.expandvars(path))
Run Code Online (Sandbox Code Playgroud)
检查结果:
>>> print(expandvars2('$TERM$FOO\$BAR'))
xterm-256color\$BAR
Run Code Online (Sandbox Code Playgroud)
变量$TERM被扩展为其值,不存在的变量$FOO被扩展为空字符串,并且\$BAR不被触及。
| 归档时间: |
|
| 查看次数: |
9286 次 |
| 最近记录: |