4 回答

TA貢獻1788條經驗 獲得超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

TA貢獻1876條經驗 獲得超6個贊
您可以使用方法partition和replace。工作代碼如下所示:
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)
所以你會得到:
選擇 sdfdsf @@@SELECT sdrr @@@SELECT 5445ff
如果string = "Blabla is SELECT sdfdsf SELECT sdrrr SELECT 5445ff",您將得到:
Blabla 是 SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff

TA貢獻1784條經驗 獲得超8個贊
您可以itertools.count使用re.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總是放在字符串的開頭,您可以使用否定的lookbehind:
r = re.sub('(?<!^)SELECT', lambda x:f'@@@{x.group()}', string)
輸出:
'SELECT sdfdsf @@@SELECT sdrrr @@@SELECT 5445ff'

TA貢獻1850條經驗 獲得超11個贊
另一種方法:
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
添加回答
舉報