2

我已经寻找答案。我相信他们在那里,但有太多的错误命中。

这是我的脚本(我的尝试失败):

#!/bin/env python

import re

usage="""
    My favorite restaurant is <<<res>>>
    My favorite person is <<<per>>>
"""

res="pizza hut"
per="my sister"

def main():
    value = re.sub(r'<<<(\w+)>>>', globals()[r'\1'], usage)
    print 'value=%s.' % (value)

if ( __name__ == "__main__"):
    main()

我要输出的是:

value=
    My favorite restaurant is pizza hut
    My favorite person is my sister
.

我见过的最接近的答案涉及维护一个单独的列表。我不想维护一个单独的列表。

4

4 回答 4

2

您可以使用函数作为re.sub(). 该函数将接收匹配对象作为唯一参数,并应返回一个字符串。最好的方法是用你的替换创建一个字典:

import re

usage="""
    My favorite restaurant is <<<res>>>
    My favorite person is <<<per>>>
"""

rep = {"res": "pizza hut",
       "per": "my sister"}

print re.sub(r'<<<(\w+)>>>', lambda m: rep.get(m.group(1), ""), usage)

您可以使用与 完全相同的方法globals(),但是globals()当字典以更安全的方式提供相同的行为时,通常不鼓励以这种方式使用。

于 2013-11-07T16:58:38.503 回答
2

使用 adict而不是使用变量,并更改<<<res>>>{res}使用正则表达式,以便您可以在其上使用字符串格式:

>>> import re
>>> usage="""                                   
    My favorite restaurant is <<<res>>>
    My favorite person is <<<per>>>
"""
>>> my_dict = {'res':'pizza hut', 'per':'my sister'}
>>> print re.sub(r'<<<(\w+)>>>', r'{\1}', usage).format(**my_dict)

    My favorite restaurant is pizza hut
    My favorite person is my sister
于 2013-11-07T17:00:06.687 回答
1

这是一种危险的使用方式eval

def repl(match):
    return eval(match.group(0)[3:-3])

print re.sub(r'<<<\w+>>>', repl, usage)

输出:

My favorite restaurant is pizza hut
My favorite person is my sister
于 2013-11-07T17:14:39.203 回答
1

您可以随意修改格式吗?Python 已经通过以下方式支持这一点:

usage = """
    My favorite restaurant is {res}
    My favorite person is {per}
"""
res = "pizza hut"
per = "my sister"

print usage.format(**globals())
于 2013-11-07T16:59:04.710 回答