替换除Python中第一次出现的子字符串以外的所有内容?

时间:2019-10-12 11:13:07

标签: python

我有一个类似于下面的字符串

string = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"

现在,我要用SELECT替换除@@@SELECT之外的所有"SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff" ,以便最终字符串看起来像这样

replace()

现在,Python string = string.replace("SELECT", "@@@SELECT) 替换了所有出现的SELECT。

"@@@SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff"

因此字符串变为

SELECT

如何确保除了第一个实例以外的所有其他东西都被替换?

注意:该字符串可以出现n次{{1}}

7 个答案:

答案 0 :(得分:4)

带有附加的“ 反向”替换步骤:

s = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
res = s.replace("SELECT", "@@@SELECT").replace("@@@SELECT", "SELECT", 1)
print(res)

输出:

SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff

更复杂但可以确保目标词的边界如下:

import re

def make_replacer():
    rpl = ''
    def inner(m):
        nonlocal rpl
        res = rpl + m.group()
        rpl = '@@@'
        return res
    return inner

s = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
res = re.sub(r'\bSELECT\b', make_replacer(), s)
print(res)   # SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff

答案 1 :(得分:3)

您可以使用方法partitionreplace。工作代码如下:

string = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
parts = string.partition("SELECT")  # returns a tuple
results = parts[0] + parts[1] + parts[2].replace("SELECT", "@@@SELECT")

print(results)

所以您会得到:

  

SELECT sdfdsf @@@ SELECT sdrrr @@@ SELECT 5445ff

如果string = "Blabla is SELECT sdfdsf SELECT sdrrr SELECT 5445ff",您将获得:

  

Blabla是SELECT sdfdsf @@@ SELECT sdrrr @@@ SELECT 5445ff

答案 2 :(得分:2)

跳过现有的前三个字母怎么样?

string = string.replace("SELECT", "@@@SELECT)[3:]

答案 3 :(得分:2)

您可以将itertools.countre.sub一起使用:

import re, itertools
c = itertools.count()
string = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
r = re.sub(r"\bSELECT\b", lambda x:x.group() if not next(c) else f'@@@{x.group()}', string)

输出:

'SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff'

但是,如果始终将SELECT放在字符串的开头,则可以在后面使用负号:

r = re.sub('(?<!^)SELECT', lambda x:f'@@@{x.group()}', string)

输出:

'SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff'

答案 4 :(得分:1)

import string

def removeExceptFirst(s, old, new):
    i = s.find(old) + len(old)
    newStr = s[0:i]
    newStr += s[i:].replace(old, new)
    return newStr

print(removeExceptFirst("SELECT sdfdsf SELECT sdrrr SELECT 5445ff", "SELECT", "@@@SELECT"))

输出:

  

SELECT sdfdsf @@@ SELECT sdrrr @@@ SELECT 5445ff

答案 5 :(得分:1)

另一种方法:

import re
from itertools import chain, repeat
string = 'SELECT sdfdsf SELECT sdrrr SELECT 5445ff'
string = ''.join(x + s for x, s in zip(chain(['', 'S'], repeat('@@@S')), re.split(r'\bS(?=ELECT\b)', string)))
print(string)

输出:

SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff

答案 6 :(得分:0)

使用此代码(更简单,仅使用splitreplace

string = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
string = "SELECT " + string.split('SELECT', 1)[1].strip().replace('SELECT', '@@@SELECT').strip()

但是如果SELECT前面有文本,请使用

string = "SELECT sdfdsf SELECT sdrrr SELECT 5445ff"
string = string.split('SELECT', 1)[0].strip() + " SELECT " + string.split('SELECT', 1)[1].strip().replace('SELECT', '@@@SELECT').strip()

该代码删除第一个SELECT,然后替换所有SELECT子字符串,然后将SELECT字符串添加到主字符串中