【问题标题】:how to substitute part of a string in python?如何在python中替换字符串的一部分?
【发布时间】:2011-04-02 19:04:36
【问题描述】:

如何在 Python 中替换另一个字符串中的一组字符?

这是我正在尝试做的事情:假设我有一个字符串“abcdefghijkl”并想用 A 替换结束符号 (k) 中的 2-d。我收到一个错误:

>>> aa = 'abcdefghijkl'
>>> print aa[-2]
k
>>> aa[-2]='A'

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    aa[-2]='A'
TypeError: 'str' object does not support item assignment

所以,问题是:有没有一种优雅的方法可以从指定位置开始用另一个字符串中的字符串符号替换(替换)?比如:

# subst(whole_string,symbols_to_substiture_with,starting_position)

>>> print aa
abcdefghijkl
>>> aa = subst(aa,'A',-2)
>>> print aa
abcdefghijAl

subst 的非暴力代码是什么?

【问题讨论】:

标签: python string substitution substring


【解决方案1】:
TypeError: 'str' object does not support item assignment

这是意料之中的——python 字符串是不可变的。

一种方法是切片和切块。像这样:

>>> aa = 'abcdefghijkl'
>>> changed  = aa[0:-2] + 'A' + aa[-1]
>>> print changed
abcdefghijAl

连接的结果,changed 将是另一个不可变字符串。请注意,这不是适合所有替代方案的通用解决方案。

【讨论】:

  • 您缺少尾随的“l”字符。
【解决方案2】:

如果您要替换的位置始终相同,则可以执行以下操作:

>>> s = s[0:-2] + "A" + s[-1:]
>>> print s
abcdefghijAl

一般情况下,你可以这样做:

>>> rindex = -2 #Second to the last letter
>>> s = s[0:rindex] + "A" + s[rindex+1:]
>>> print s
abcdefghijAl

编辑:非常一般情况,如果您只想在替换中重复单个字母:

>>> s = "abcdefghijkl"
>>> repl_str = "A"
>>> rindex = -4 #Start at 4th character from the end
>>> repl = 3 #Replace 3 characters
>>> s = s[0:rindex] + (repl_str * repl) + s[rindex+repl:]
>>> print s
abcdefghAAAl

【讨论】:

  • 如果替换长于 1 个符号怎么办? “AAA”而不是“A”。而且我需要替换原字符串中的三个符号(不是一换三,而是和替换的长度一样)。
【解决方案3】:

由于字符串是不可变的,因此您必须对其进行切片并实例化一个新字符串:

aa = aa[:-2] + 'A' + aa[-1:]

【讨论】:

    【解决方案4】:

    另一种方法:

    s = "abcdefghijkl"
    l = list( s )
    l[-2] = 'A'
    s = "".join( l )
    

    Python 中的字符串是不可变的序列 - 非常类似于元组。您可以从字符串或元组创建一个可变的列表,更改相关索引并使用join 将列表转换回字符串或使用元组构造函数转换为tuple

    编辑:如果是字符串,您可以使用 bytearray (docs) 类型而不是 list,这使得使用 str 构造函数转换为字符串成为可能。

    另外,您可以实现自己的或使用标准库中的此类:http://docs.python.org/library/userdict.html#UserString.MutableString,如下所示:

    >>> from UserString import MutableString
    >>> s = MutableString( "zdfgzbdr " )
    >>> s
    'zdfgzbdr '
    >>> s[1:5]
    'dfgz'
    >>> s[1:5] = "xxxx"
    >>> s
    'zxxxxbdr '
    

    遗憾的是 - MutableString 已被弃用,并且在 Py3k 中不可用(我认为您仍然可以编写自己的类)。

    【讨论】:

    • 振作起来,你还有bytearray
    • @gnibbler 我很惊讶。我不知道这种类型存在,谢谢。
    【解决方案5】:

    回复其他帖子的评论:

    要直接用字符串进行三个字符替换(另见 bytearray 帖子),您可以对序列进行分区,特别是如果您不知道不搜索的位置:

    aa = 'abcdefghijkl'
    replace = 'def'
    withstring = 'QRS'
    newstr,found,endpart = aa.partition(replace)
    
    if found:
        newstr+=withstring+endpart
        print newstr
    else:
        print "%r string is not in %r" % (replace,aa)
    

    这种情况下替换的长度不需要和原来的一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-22
      • 2012-04-19
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多