【问题标题】:Python regex, pulling patterns out of a match and using them as input back into the matchPython 正则表达式,从匹配中提取模式并将它们用作输入回到匹配中
【发布时间】:2013-11-19 10:48:18
【问题描述】:

我已经找到了答案。我确定他们在那里,但有太多的错误命中。

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

#!/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
.

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

【问题讨论】:

  • 你为什么在这里使用globals()?您的代码中没有全局名称 \1(也不可能存在)。

标签: python regex python-2.7


【解决方案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

【讨论】:

  • 等等,在所有答案中,您选择eval()
  • The closest answer that I have seen, involves maintaining a separate list. I do not want to have to maintain a separate list. 我给出了解决方案,没有使用单独的列表或字典。
  • 是的,这是最接近我想要的。
【解决方案2】:

使用dict 而不是使用变量,并使用正则表达式将&lt;&lt;&lt;res&gt;&gt;&gt; 更改为{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

【讨论】:

    【解决方案3】:

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

    usage = """
        My favorite restaurant is {res}
        My favorite person is {per}
    """
    res = "pizza hut"
    per = "my sister"
    
    print usage.format(**globals())
    

    【讨论】:

    • 感谢您的回答。我试过了,它奏效了,所以我给了你一个赞成票!
    • 我不知道我的最终使用字符串可能需要在其中包含不打算替换的“{some stuff}”模式。因此,我可能不得不更改替换模式以确保所有内容都打算被变量值替换。我希望能够更改此设置(即更改为 __VAR(???)__,而不是 &lt;&lt;&lt;???&gt;&gt;&gt;)。
    【解决方案4】:

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

    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()

    【讨论】:

    • 啊,你打败了我:P 很多...我怎么没看到这个(+1)
    • 感谢您的回答。我试过了,它奏效了,所以我给了你一个赞成票!
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多