遵循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文档中给出的表单实际上在某种程度上是正确的。
答案 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)
完全相同。碰巧的是,如果s
是str
,则与string.replace(old, new)
完全相同。但出于历史原因,这确实是巧合。
作为旁注,您几乎不想在string
模块中调用函数。它们主要是早期版本的Python的延续。实际上,string.replace
列在文档中的“不推荐使用的字符串函数”部分下,就像您可能在那里寻找的大多数其他函数一样。整个模块尚未弃用的原因是它有一些不属于str
(或bytes
或unicode
)类的东西,例如像{{{}这样的常量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 替换。如果给出了可选参数计数,则仅替换出现的第一个计数。
VSCode
中)语法注意语法是:
<块引用>str.replace(self: str, old, new, count) -> str
It seems odd that you'd need the "str" repeated
不奇怪,在你知道细节之后:
-> str.replace(old, new[, count])
有两个正常用例:
str
originalStr = 'grateful'
replacedStr = str.replace(originalStr,'t','c')
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,所以报错:
类型错误:需要一个整数
如上所述,将您的代码更改为:
str
originalStr = 'grateful'
replacedStr = str.replace(originalStr,'t','c')
string variable
本身originalStr = 'grateful'
replacedStr = originalStr.replace('t','c')