如何将空字符串替换为0,但如果不为空,则将其保留

时间:2018-08-13 05:09:39

标签: python replace strip

在如下所示的情况下(使用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为什么产生这些结果。

5 个答案:

答案 0 :(得分:4)

如果s是字符串,则:

s.replace(old, new)

返回s的副本,每次出现的字符串oldnew替换,因此例如:

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

说明(用于替换字符串):

  1. str.replace(..)用第二个arg替换第一个arg
  2. ""总是在字符串中(看看我的意思是'ab'.count('')返回3)

说明(以我的示例为例):

  1. 我创建一个def(函数)
  2. 然后我做一个字典
  3. 然后我dict.get进行检查