【问题标题】:Pythonic String ManipulationPythonic 字符串操作
【发布时间】:2013-09-06 13:32:57
【问题描述】:

如何以更高效的 Python 友好方式执行以下操作?

first_team= re.sub("Northern", "N", first_team)
first_team=re.sub("Western", "W", first_team)
first_team=re.sub("Southern", "S", first_team)
first_team=re.sub("Eastern", "E", first_team)

【问题讨论】:

    标签: python string dictionary


    【解决方案1】:

    使用 for 循环:

    for direction in ('Northern', 'Western', 'Southern', 'Eastern'):
        first_team = first_team.replace(direction, direction[0])
    

    没有必要在这里使用re.sub 来处理这种简单的替换:),str.replace 完全可以。

    【讨论】:

    • 您的代码适用于这个特定示例。如果 OP 真的想要这个,很好。但是对于一般替换,需要指定一个映射,就像其他海报提出的那样。
    【解决方案2】:

    我会使用.replace 并这样做:

    opts = [ ("Northern", "N"), ("Western", "W"), ("Southern", "S"), ("Eastern", "E") ]
    
    for opt in opts:
        first_team = first_team.replace(opt[0], opt[1])
    

    【讨论】:

      【解决方案3】:

      您的re.sub()s 可以使用lambda 作为第二个参数重写为单行:

      >>> import re
      >>> s = "Northern Western Southern Eastern" 
      >>> re.sub("(Northern|Western|Southern|Eastern)", lambda x: x.group(1)[0] , s)
      'N W S E'
      

      请注意,通过正则表达式进行替换太简单了。

      但是,例如,如果您想替换 north、North 之类的字符串,该怎么办:

      >>> s = "Northern North north Western Southern Eastern" 
      >>> re.sub("([Nn]orth(ern)?|[Ww]est(ern)?|[Ss]outh(ern)?|[Ee]ast(ern)?)", lambda x: x.group(1)[0].upper(), s)
      'N N N W S E'
      

      您可能需要使用re.sub。


      另外,您可以将replace() 与reduce() 一起使用:

      >>> opts = {"Northern": "N", "Western": "W", "Southern": "S", "Eastern": "E"}
      >>> reduce(lambda k, v: k.replace(*v), opts.iteritems(), s)
      'N W S E'
      

      这与在 for 循环中应用 replace() 基本相同,但以函数式编程风格编写。

      【讨论】:

        【解决方案4】:

        我想向您展示我自己的解决方案。乍一看可能很复杂,但是定义了“基础”之后,应用真的很简单

        首先,我将映射定义为元组列表:

        our_mapping = [("Northern", "N"),
                   ("Western", "W"),
                   ("Southern", "S"),
                   ("Eastern", "E")]
        

        现在问题来了:我定义了一个工厂函数,它递归地创建了一个 All-In-One 替换函数:

        def replacer_factory(mapping):
            if len(mapping) < 1:
                return lambda x: x
            original, replacement = mapping[0]
            return lambda x: replacer_factory(mapping[1:])(x.replace(original, replacement))
        

        现在我可以用我的映射创建一个替换函数:

        our_replacer = replacer_factory(our_mapping)
        

        然后申请真的很简单:

        >>> in_ = "Northern Western Southern Eastern"
        >>> out_ = our_replacer(in_)
        >>> print in_
        Northern Western Southern Eastern
        >>> print out_
        N W S E
        

        我真的很喜欢我们不需要任何参数来调用our_replacer,所有映射逻辑都隐藏在其中。现在可以轻松定义任意替换器并使用它们。

        这里是整个代码:

        our_mapping = [("Northern", "N"),
                   ("Western", "W"),
                   ("Southern", "S"),
                   ("Eastern", "E")]
        
        def replacer_factory(mapping):
            if len(mapping) < 1:
                return lambda x: x
            original, replacement = mapping[0]
            return lambda x: replacer_factory(mapping[1:])(x.replace(original, replacement))
        
        our_replacer = replacer_factory(our_mapping)
        
        in_ = "Northern Western Southern Eastern"
        out_ = our_replacer(in_)
        
        print in_
        print out_
        

        我同意这可以被视为“高级” - 所以如果您是新手并且“只想让它工作”,请坚持使用 jabaldonedos 的答案。

        【讨论】:

        • 递归地这样做是没有必要的,效率低下而且过于复杂:(
        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 2019-08-28
        相关资源
        最近更新 更多