某些编程语言提供了动态执行正则表达式替换的功能。
例如,假设我们有一个类似$USER
的字符串,其中$GROUP
和foo:john:admin
将被其环境变量替换。转换后的字符串看起来像\$[A-Za-z]+
。要解决此问题,我们必须使用匹配<?php
preg_replace_callback(
# the regular expression to match the shell variables.
'/\$[A-Za-z]+/',
# Function that takes in the matched string and returns the environment
# variable value.
function($m) {
return getenv(substr($m[0], 1));
},
# The input string.
'foo:$USER:$GROUP'
);
的所有字符串并查找环境变量值。
在PHP中,以下内容如下所示:
{{1}}
Python中有类似的东西吗?
答案 0 :(得分:1)
您可以将re.sub
与lambda表达式或类似于PHP回调方法一起使用。
import re, os
s = 'foo:$USER:$GROUP'
rx = r'\$([A-Za-z]+)'
result = re.sub(rx, lambda m: os.getenv(m.group(1)), s)
print(result)
\$([A-Za-z]+)
模式匹配$
,然后将1个或多个ASCII字母捕获到组1中。在lambda表达式中,m
表示匹配数据对象。 USER
或GROUP
位于m.group(1)
内。
答案 1 :(得分:1)
Hello user2064000,
是的,python为正则表达式提供了许多内置函数。
返回通过替换repl替换字符串中最左边非重叠模式而获得的字符串。如果未找到模式,则返回字符串不变。 repl可以是字符串或函数;如果它是一个字符串,则处理其中的任何反斜杠转义。也就是说,\ n被转换为单个换行符,\ r \ n被转换为回车符,依此类推。诸如\ j之类的未知转义单独留下。后向引用(例如\ 6)将替换为模式中第6组匹配的子字符串。
Syntex
import re
result = re.sub(pattern, callback, subject)
result = re.sub(pattern, callback, subject, limit)
有用的链接,
https://docs.python.org/2/library/re.html
import re, os
def replaceFunction(matchobj):
if matchobj.group(0) == "$USER":
return os.getenv(matchobj.group(1))
elif matchobj.group(0) == "$GROUP":
return os.getenv(matchobj.group(1))
print re.sub(r'\$([A-Za-z]+)', replaceFunction, 'foo:$USER:$GROUP')
答案 2 :(得分:0)
您可以使用类似这样的内容:
@classmethod
def normalize_query_string(cls, query_string):
def replace_fields(match):
x = match.group("field")
if x == "$certHash":
return "ci.C.H:"
return "{}:".format(x)
result = re.sub(r"(?P<field>\$[\w.]+):", replace_fields, query_string)
return result