2017-10-06 2 views
1

문자열로 chars를 목록으로 분할하고 반복하여 문자로 대체하려고합니다.문자열에서 한 번에 모든 문자 대체

값으로 대체해야하는 모든 키에 대한 사전을 만들었습니다. 나는 하나 개의 문자 변경 후 전체 문자열을 만드는 오전 때문입니다

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

:

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 > 36"]

가 어떻게 하나의 실행에 그것을 할 수 있습니까?

답변

1

정규식 솔루션 : (이것은 또한 equality에서 eq 같은 다른 단어에있는 키를 대체 할 대체됩니다 : =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) 

편집 : 여기 가있다 분리 및 결합 방식 : (단어 사이에 공백이있는 여러 공백을 하나의 공백으로 대체합니다.)

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

다음 예는 운영자 키워드의 모든 인스턴스를 대체합니다. 또한 형평과 같은 임베디드 단어가 무시되도록합니다. 단어 경계와 일치하는 정규식과 \b를 사용하여

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

이 교체되는 단어 평등을 방지 할 수 있습니다.

정규 표현식과 일치하는 단어가 없으면 딕타에서 일치하지 않는 단어가 반환됩니다.

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

이 경우에 u는 패턴을 ''| '.'로 대체 할 수 있습니다 .join (dicta.keys()'는 주석으로 – Skycc

+0

여러분의 노력에 감사 드리며, 이것은 또한'equity'와 같은 단어를'= uity'로 대체합니다. 가장 좋은 방법은. – bhansa

관련 문제