在如下所示的情况下(使用python 3.6.5)替换值时,Python的行为似乎不一致
>>> emptyString = ' '
>>> emptyString.strip().replace('','0') #produces expected results
'0'
>>> notEmptyString = ' 50 '
>>> notEmptyString.strip().replace('','0') #expected '50'
'05000'
>>> shortString = notEmptyString.strip()
>>> shortString #results as expected
'50'
>>> shortString.replace('','0') #unexpected results - expected '50'
'05000'
这就是我想要看到的:
- 如果字符串中有一个值,则只删除()前和后空格。
- 如果字符串为空(即“”)或字符串只是空白字符(即“”),则将其剥离为“”并将“”替换为'0'
示例#1 ...字符串=“ 10” .... 尾随空格
Example#2 ... string =''....然后转换为 '0'
我可以通过其他方式获得所需的结果,但我想知道是否有人了解python为什么产生这些结果。
答案 0 :(得分:4)
如果s
是字符串,则:
s.replace(old, new)
返回s
的副本,每次出现的字符串old
被new
替换,因此例如:
In [7]: "abracadabra".replace("a","4")
Out[7]: '4br4c4d4br4'
在特殊情况下,如果old
是空字符串,它将在字符串的开头和结尾以及每对字符之间插入new
:
In [8]: "12345678".replace("","_")
Out[8]: '_1_2_3_4_5_6_7_8_'
基本原理是,在第一个字符之前,每对字符之间以及最后一个字符之后都有一个“空字符串”,这就是要替换的内容。
所以replace
并没有按照您的想法做。
要做什么,可以使用已经提出的一种解决方案,或者如果您觉得很聪明,可以使用类似的方法:
s.strip() or "0"
答案 1 :(得分:3)
这与replace
的工作方式有关。
将其视为查看字符串的每个索引,并从每个索引创建一个子字符串。然后,它检查是否有任何子字符串以要查找的字符串开头。然后,它会记录以要查找的字符串开头的子字符串的索引,删除要查找的字符串,然后在这些索引处插入替换字符串。
对于''
,只有一个索引可以浏览,并且从该索引开始的子字符串是''
,它以''
开头,因此插入了0。
对于50
,有3个索引需要浏览。从索引开始的子字符串是:
'50'
'0'
''
所有这些子字符串均以''
开头,因此将0插入所有索引中,从而创建'05000'
。
答案 2 :(得分:3)
str.replace
的工作方式您将方法str.replace
解释为好像它用新值替换了整个字符串。事实并非如此。
它的作用是将字符串中的第二个参数替换为第一个参数的每次出现。
'ababc'.replace('ab', 'x') # 'xxc'
这里可能令人困惑的是,您正在替换每次出现的空字符串。原来空字符串到处都是,每两个字符之间是一个空字符串。
如果这对您没有意义,请考虑以下内容确实是True
'' + '5' + '' + '0' + '' == '50'
这样做...
s.replace('', '0')
等效于在所有字符之间插入'0'
。等效于以下内容。
'0'.join(s.split())
您要执行的操作是剥离字符串并将其'0'
设为空,这是几种方法。
# 1)
s = emptyString.strip()
s = s if s else '0'
# 2)
s = emptyString.strip() or '0'
答案 3 :(得分:2)
按照@coldspeed的建议,您需要:
def myfunc(string): return string if string.strip() else '0'
print(myfunc(' 050 '))
print(myfunc(' '))
print(myfunc(''))
print(myfunc('abcd'))
输出:
050
0
0
abcd
答案 4 :(得分:2)
另一种方法:
def f(s):
return {'':'0'}.get(s.strip(),s)
print(f(' '))
print(f(' a '))
输出:
0
a
说明(用于替换字符串):
""
总是在字符串中(看看我的意思是'ab'.count('')
返回3)说明(以我的示例为例):
dict.get
进行检查