2017-10-06 33 views
1

我想通過將字符串拆分爲列表並對其進行迭代來替換字符串中的字符。在一次運行中替換字符串中的所有字符

我已經爲需要用值替換的所有鍵創建了字典。

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36" 
[s.replace(char, dicta.get(char)) for char in s.split(" ") if char in dicta ] 

上述解決方案給我的輸出:

["name = 'alex' and age gt 36", "name eq 'alex' and age > 36"] 

這是因爲我創造一個字符改變後的整個字符串。

預期輸出:["name = 'alex' and age > 36"]

我怎麼能做到這一點的只有一個運行?

回答

1

正則表達式的解決方案:(這也將取代在像equalityeq換句話說發現鍵將被代替:=uality

import re 

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36 equality" 

# pattern that matches every key in dicta with white space around it 
pattern = '|'.join(dicta.keys()) 

ans = re.sub(pattern, lambda x : dicta.get(x.group(0)), s) 

print(ans) 

編輯: 這裏是一個拆分和連接方法:(這將用單個空間tho替換單詞之間的多個空格)

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36 equality" 
ans = ' '.join([dicta.get(word, word)for word in s.split()]) 

print(ans) 
1

嘗試reduce

from functools import reduce 

dict = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36" 


reduce(lambda x, y: x.replace(y, dict[y]), dict, s) 
0

我想,你的代碼的問題是下面:

>>> s="name eq" 
>>> s.replace('eq','=') 
'name =' 
>>> s.replace('name','Name') 
'Name eq' 
>>> 

你必須保存第一次更換,並用它進行第二次更換。

代碼:

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36" 

d= s.split(" ") 
for char in s.split(" "): 
    if char in dicta.keys(): 
     s = s.replace(str(char), str(dicta.get(char))) 
print s 

輸出:

"C:\Program Files (x86)\Python27\python.exe" C:/Users/punddin/PycharmProjects/demo/demo.py 
name = 'alex' and age > 36 
1

下面的示例替換操作關鍵字的所有實例。它還可以確保諸如公平等嵌入的詞語被忽略。

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36" 

words = s.split(" ") 
result = [] 
for w in words: 
    result.append(dicta.get(w,w)) 

print(" ".join(result)) 
1

使用正則表達式和\b匹配字邊界,這將避免字平等被替換。

正則表達式匹配單詞,如果鍵不匹配,就會返回相同的單詞。

dicta = { 
    "eq" : "=", 
    "gt" : ">", 
    "lt" : "<" 
} 

s = "name eq 'alex' and age gt 36" 

import re 


ans = re.sub(r'\b({})\b'.format('|'.join(dicta.keys())), lambda x : dicta.get(x.group(0), x.group(0)), s) 
### can try regex below also 
# ans = re.sub(r'\b(\w+)\b', lambda x : dicta.get(x.group(0), x.group(0)), s) 

# "name = 'alex' and age > 36" 
+0

字典中單詞的長度可能不總是2。 – bhansa

+0

對於這種情況下,你可以用''''.join(dicta.keys()')替換模式,如 – Skycc

+0

感謝您的努力,這也將'equity'替換爲'= uity'。我認爲循環是 – bhansa

相關問題