正确更换"开始" python中使用正则表达式

时间:2017-10-25 19:11:13

标签: python regex string replace

注意:这篇文章与帖子" 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 _"在传递给它的所有字符串的开头的字符串。换句话说......

GOOD RESULT:如果方法传递了字符串*@#$ThisIsMyString1,则会正确返回BEGINNING_ThisIsMyString1

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

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

3 个答案:

答案 0 :(得分:1)

您使用*量词匹配0个或更多非字母字符实例,这意味着它总是会被您的模式选中。你可以用

替换你拥有的东西
re.sub('^[^a-zA-Z]+', ...)

确保只匹配一个或多个实例。

答案 1 :(得分:0)

替换

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

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

答案 2 :(得分:0)

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

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

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

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