【问题标题】:python replace specific elements in a stringpython替换字符串中的特定元素
【发布时间】:2015-11-19 15:24:08
【问题描述】:

我有一个字符串'1472_1 2014-6-19',我想用单词“Normal”替换下划线后面的任何数字(在本例中为第一个),我所做的是找到我想要替换的元素的索引:

print line.replace(line[line.find('_') + 1:line.find(' ')],'Normal', 1)

但是我没有得到'1472_Normal 2014-6-19',而是得到了'Normal472_1 2014-6-19' 似乎我的代码替换了第一个 1 而不是下划线后面的那个。

我已经阅读了这篇文章:Replacing specific words in a string (Python),但仍然想知道有没有办法指定要替换的元素而不是使用正则表达式?

为了清楚起见,下划线后面的数字可以是 0 到 237 之间的任何数字

【问题讨论】:

  • 您可以使用正则表达式还是将其保留为字符串操作?
  • 你必须使用正则表达式。值不是静态的任何地方都需要通配符。这需要正则表达式
  • 其实我想避免正则表达式,所以我想知道有没有其他方法可以做到这一点?
  • @Enkri_ - 如果你不理解也没关系。我仍然不明白其中一些变得相当复杂。但是,因此您有一定的背景,这个工具应该成为您最好的朋友。 regex101.com
  • 这里不需要正则表达式。

标签: python replace


【解决方案1】:

你可以使用str.partition():

first, delimiter, second = line.partition('_')
a, s, b = second.partition(' ')
print first + delimiter + 'Normal' + s + b

【讨论】:

  • 编辑处理下划线后的多个数字(与另一个partition())。
  • @TigerhawkT3 还有一个问题,我在原帖中使用的方法有什么问题?
  • line[line.find('_') + 1:line.find(' ')] 评估为 '1',因此它用 'Normal' 替换了它找到的第一个 '1'
  • @TigerhawkT3 非常感谢
  • 您可以通过删除+ 1 并在Normal 之前添加下划线来修复它:line.replace(line[line.find('_') :line.find(' ')], '_Normal', 1)
【解决方案2】:

没有正则表达式

string = '1472_1 2014-6-19'
to_replace = string[string.find('_'):string.find(' ')]
string = string.replace(to_replace,'_Normal')
print string

【讨论】:

  • 你怎么知道后面总会有空格?你不是先生
  • 因为 OP 期待这个?
  • 希望哈!那么是的,它可以这么简单
  • 他提供的字符串显然是'whatever date'。你怎么知道有空间还是没有空间?你不是先生。
  • 谢谢各位,数据后面有空格
【解决方案3】:

如果基于line.find(' ')的数字后面总是有一个空格,则不使用正则表达式,拆分一次以分割字符串并去除任何数字:

s = '1472_1 2014-6-19'

a,b = s.split(None,1)

print("{}Normal {}".format(a.rstrip("0123456789"),b))) 
1472_Normal 2014-6-19  

下划线后的任意位数都可以剥离。

使用正则表达式:

 import  re

s = '1472_1 2014-6-19'

print(re.sub("(?<=_)\d+","Normal",s))
1472_Normal 2014-6-19

为什么你自己的代码失败是因为你的字符串开头有一个1,所以你替换它而不是下划线后面的那个

【讨论】:

  • OP 专门要求非正则表达式解决方案。
【解决方案4】:

如果您不想使用 RegEx,可以使用切片来隔离要替换的字符串部分。例如:

def replace_normal(s)
    ui = s.index('_')  # index of first underscore
    si = s.index(' ')  # index of first space
    return s[:ui+1] + 'Normal' + s[si:]

s1 = '1472_1 2014-6-19'
s2 = '1571_44 2014-7-24'

print replace_normal(s1)  # 1472_Normal 2014-6-19
print replace_normal(s2)  # 1571_Normal 2014-7-24

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2012-09-14
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多