string.replace的正确形式是什么?

时间:2012-09-19 18:56:25

标签: python string replace

遵循string.replace(http://docs.python.org/library/string.html)的Python文档:

  

string.replace(str,old,new [,maxreplace])

     

返回字符串str的副本,其中所有出现的substring old都替换为new。如果给出了可选参数maxreplace,则替换第一个maxreplace事件。

使用给定格式会产生以下错误:

>>> a = 'grateful'
>>> a.replace(a,'t','c')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required

你需要重复的“str”似乎很奇怪,从错误中我猜到我的第三个参数被用于maxreplace。

格式:

  

string.replace(old,new)

似乎按预期运作。

我想知道我是否误解了某些内容,而且Python文档中给出的表单实际上在某种程度上是正确的。

5 个答案:

答案 0 :(得分:7)

我认为你的混淆(以及大多数答案的混淆)是string模块和str内置类之间的不同。即使功能上有很多重叠,它们也是完全不同的东西。

string.replace(s, old, new)是一个自由函数,而不是一个方法。您无法将其称为s.replace(old, new),因为s不能是string模块的实例。

str.replace(self, old, new)是一种方法。与任何其他方法(除了classmethod和staticmethod方法除外)一样,您可以 - 并且通常通过str实例将其称为s.replace(old, new),其中s成为self自动参数。

您还可以通过课程调用方法,因此str.replace(s, old, new)s.replace(old, new)完全相同。碰巧的是,如果sstr,则与string.replace(old, new)完全相同。但出于历史原因,这确实是巧合。

作为旁注,您几乎不想在string模块中调用函数。它们主要是早期版本的Python的延续。实际上,string.replace列在文档中的“不推荐使用的字符串函数”部分下,就像您可能在那里寻找的大多数其他函数一样。整个模块尚未弃用的原因是它有一些不属于str(或bytesunicode)类的东西,例如像{{{}这样的常量1}}。

答案 1 :(得分:3)

是的,该文档是正确的,因为它指的是使用string.replace()作为独立函数。所以你可以这样做:

>>> import string
>>> string.replace("a","a","b")
'b'

这与调用replace()作为给定字符串的方法不同,如下所示:

>>> 'a'.replace('a','b')
'b'

它们是两个具有不同语法但设计为具有相同结果的不同内容。因此,使用其他语法调用一个将导致错误。例如:

>>> 'a'.replace('a','a','b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required

答案 2 :(得分:2)

看起来你将字符串模块的'replace'方法与python字符串的'replace'方法混淆。

string.replace("rest,"r", "t")

将返回“test”

"rest".replace("r", "t") 

将返回“test”

"rest".replace("rest", "r", "t") 

将返回您提及的错误

答案 3 :(得分:0)

Python方法使用显式self。也就是说,在C ++ / javscript具有魔术this变量的地方,Python将其作为第一个参数显式传递。调用方法时,点左侧的对象成为方法的第一个参数。

这些是等价的:

str.replace('foobar', 'o', 'O', 1)

'foobar'.replace('o', 'O', 1)

您会发现两种情况都只涉及四个值(以及一个类:str)。

答案 4 :(得分:0)

更新最新语法

现在是2021

最新官方文档

移到这里:string replace

<块引用>

str.replace(old, new[, count])

返回字符串的副本,其中所有出现的子字符串 old 都被 new 替换。如果给出了可选参数计数,则仅替换出现的第一个计数。

对应的python代码(在VSCode中)语法注意

enter image description here

语法是:

<块引用>

str.replace(self: str, old, new, count) -> str

回答:It seems odd that you'd need the "str" repeated

不奇怪,在你知道细节之后:

  • Python 的内置 String 类 名为:str

-> str.replace(old, new[, count]) 有两个正常用例:

用例 1:使用内置字符串类 str

originalStr = 'grateful'
replacedStr = str.replace(originalStr,'t','c')

用例 2:使用 string variable 本身

originalStr = 'grateful'
replacedStr = originalStr.replace('t','c')

回答:TypeError: an integer is required

您的(错误)代码:

a = 'grateful'
a.replace(a,'t','c')

的解释:

a.replace(a,'t','c')

匹配上述用例 2 的语法:

strVariable.replace(old, new[, count])

所以:

  • 'a' => strVariable
  • 'a' => old
  • 't' => new
  • 'c' => 可选 count

但是'c'str,不是(预期的)int,所以报错:

<块引用>

类型错误:需要一个整数

如何更改我的代码?

如上所述,将您的代码更改为:

用例 1:使用内置字符串类 str

originalStr = 'grateful'
replacedStr = str.replace(originalStr,'t','c')

用例 2:使用 string variable 本身

originalStr = 'grateful'
replacedStr = originalStr.replace('t','c')