有没有办法在Python中动态替换正则表达式?

时间:2017-08-23 09:39:43

标签: php python regex python-3.x

某些编程语言提供了动态执行正则表达式替换的功能。

例如,假设我们有一个类似$USER的字符串,其中$GROUPfoo: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中有类似的东西吗?

3 个答案:

答案 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表示匹配数据对象。 USERGROUP位于m.group(1)内。

答案 1 :(得分:1)

Hello user2064000,

是的,python为正则表达式提供了许多内置函数。

Re.sub(pattern,repl,string,count = 0,flags = 0)

返回通过替换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