注意:这篇文章与帖子" 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()行的正确方法是什么,因此它只替换字符串开头的那些非字母数字字符,这样它就不会总是插入原始输入字符串开头的替换字符串?
答案 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'