用python中的另一个字符串替换某些字符串的出现

时间:2014-02-04 18:11:45

标签: python regex string

很抱歉,如果有人已发布相同的问题,但我无法找到它。

我正在尝试用其他东西替换某些字符串模式。问题我不想替换所有事件,只是除了一个。

例如。 想象一下,我有字符串:'(M:2,Seq0:2):10,Seq1:20,(Seq2:40,Seq3:40)' 我想找到的模式是:'\w+\d+:\d'(引用Seq[number]

想象一下,我想在'Seq[number]:'之后更改所有数字 但不是例如'Seq1:'

之后的那个

想象一下,Seq[number]:之后的所有这些数字我想要总和10的值

最后我想要字符串:

'(M:2,Seq0:12):10,Seq1:20,(Seq2:50,Seq3:50)'

有没有办法在循环中执行此操作? 我尝试使用re.findall,但它返回文本中的所有出现。我怎么能把它合并到一个循环中呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用re.sub替换函数来执行此操作,例如:

>>> import re
>>> s = '(M:2,Seq0:2):10,Seq1:20,(Seq2:40,Seq3:40)'
>>> def repl(match):
...     return match.group(1) + str(int(match.group(2)) + 10)
...
>>> re.sub(r'(\w+(?!1:)\d+:)(\d+)', repl, s)
'(M:2,Seq0:12):10,Seq1:20,(Seq2:50,Seq3:50)'

不匹配Seq1:的限制由否定前瞻(?!1:)处理,捕获组仅用于将要修改的字符串部分与其余部分分开。替换函数然后返回组1不变加上组2加上10的值。

正如Cilyan在评论中所建议的那样,您还可以在替换函数中添加限制以不替换Seq1:,这简化了正则表达式。这是看起来的样子:

def repl(match):
    if match.group(1) == 'Seq1:':
        return match.group(0)
    return match.group(1) + str(int(match.group(2)) + 10)

result = re.sub(r'(\w+\d+:)(\d+)', repl, s)

编辑:要解决评论中的问题,请按照以下方法编写此内容以修改您添加的数字以及应忽略哪个前缀(如Seq1 :):

def make_repl(n, ignore):
    def repl(match):
        if match.group(1) == ignore:
            return match.group(0)
        return match.group(1) + str(int(match.group(2)) + n)
    return repl

result = re.sub(r'(\w+\d+:)(\d+)', make_repl(10, 'Seq1:'), s)