【问题标题】:Proper replacement of "beginning" non-alphanumeric characters, in python, using regular expressions使用正则表达式在 python 中正确替换“开始”非字母数字字符
【发布时间】:2017-10-25 19:11:12
【问题描述】:

注意:此帖子与帖子“Re.sub not working for me”不同。

  • 那篇文章是关于匹配和替换字符串中的任何非字母数字子字符串。
  • 此问题专门针对匹配和替换明确显示在字符串开头的非字母数字子字符串。

以下方法尝试匹配字符串的任何非字母数字字符串“AT THE BEGINNING”,并将其替换为新字符串“BEGINNING_”

def m_getWebSafeString(self, dirtyAttributeName):
  cleanAttributeName = ''.join(dirtyAttributeName)
  # Deal with beginning of string...
  cleanAttributeName = re.sub('^[^a-zA-z]*',"BEGINNING_",cleanAttributeName)
  # Deal with end of string...
  if "BEGINNING_" in cleanAttributeName:
    print ' ** ** ** D: "{}" ** ** ** C: "{}"'.format(dirtyAttributeName, cleanAttributeName)

问题描述:该方法似乎不仅替换了非字母数字字符,而且还错误地将“BEGINNING_”字符串插入到传递给它的所有字符串的开头。也就是说……

良好的结果:如果方法传递了字符串*@#$ThisIsMyString1,它会正确返回BEGINNING_ThisIsMyString1

坏/不需要的结果:但是,如果方法传递了字符串ThisIsMyString2,它会错误地(并且总是)插入替换字符串(BEGINNING_),即使没有非字母数字字符,并产生结果BEGINNING_ThisIsMyString2

我的问题: 编写 re.sub() 行的正确方法是什么,它只替换字符串开头的那些非字母数字字符,这样它就不会总是插入原始输入字符串开头的替换字符串?

【问题讨论】:

    标签: python regex string replace


    【解决方案1】:

    您正在使用 * 量词匹配 0 个或多个非字母字符实例,这意味着它始终会被您的模式拾取。你可以替换你所拥有的

    re.sub('^[^a-zA-Z]+', ...)
    

    确保只有 1 个或多个实例匹配。

    【讨论】:

    • 那行得通。感谢您对解决方案的解释。
    【解决方案2】:

    替换

    re.sub('^[^a-zA-z]*',"BEGINNING_",cleanAttributeName)
    

    re.sub('^[^a-zA-z]+',"BEGINNING_",cleanAttributeName)
    

    【讨论】:

      【解决方案3】:

      有一个更优雅的解决方案。你可以用这个

      re.sub('^\W+', 'BEGINNING_', cleanAttributeName)
      

      \W 匹配任何非字母数字字符;这相当于类 [^a-zA-Z0-9_]。

      >>> re.sub('^\W+', 'BEGINNING_', '@#$ThisIsMyString1')
      'BEGINNING_ThisIsMyString1'
      >>> re.sub('^\W+', 'BEGINNING_', 'ThisIsMyString2')
      'ThisIsMyString2'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        相关资源
        最近更新 更多