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

変数を使用するdict代わりに a を使用し、正規表現を使用するように変更<<<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 に答える
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 に答える
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 に答える