2011-10-27 5 views
4

많은 문자열 쌍과 하나의 큰 문자열 (파일의 내용)이 있습니다. 각 쌍의 첫 번째 구성원의 모든 경우를 각각의 두 번째 구성원으로 바꿔야합니다. I는 BBRT와 QQAA 발생할 때마다 교체해야 쌍 ("AA", "BB") 및 ("QQ", "RT")을 갖는 예를 들어파이썬에서 하나의 큰 문자열로 여러 문자열을 대체하는 가장 좋은 방법은 무엇입니까?

,.

쌍의 문자열은 모두 고유하므로 대체 순서는 최종 결과에서 중요하지 않습니다.

내 파이썬 코드는 대부분의 순진입니다 - 나는 모든 쌍 소진 될 때까지 연속으로하려면 string.replace 방법을 적용

>>> s="frsfsdAAsdfvsdfvqqdsff" 
>>> pairs=[('AA', 'BB'), ('qq', 'rt')] 
>>> for p in pairs: 
... s=s.replace(p[0], p[1]) 
... 
>>> s 
'frsfsdBBsdfvsdfvrtdsff' 
>>> 

나는이 큰 문자열에 대한 나쁜 솔루션입니다 생각합니다. 누구든지 더 효율적인 것을 제안 할 수 있습니까?

질문은 파이썬에서하는 방법에 관한 것입니다.

감사합니다.

답변

3

제안 된 솔루션에 다른 문제가 있습니다. 첫 번째 교체가 이루어진 후 결과 문자열이 일치 할 수 있고 동일한 문자를 다시 바꿀 수 있습니다. 예를 들어, 'qq''ff'pairs = [('qq','ff'), ('ff','qq')]으로 바꾸려고하면 솔루션에서 원하는 결과를 얻을 수 없습니다.

>>> d = dict(pairs) 
>>> import re 
>>> pattern = re.compile('|'.join(re.escape(k) for k in d)) 
>>> pattern.sub(lambda k:d[k.group()], s)) 
frsfsdBBsdfvsdfvrtdsff 
+0

아,하지만 난 명시 적으로 질문에 명시된하고 난 인용 :

대신이 시도 할 수 ** 쌍의 문자열은 모든 고유, 그래서 교체의 순서가 중요하지 않습니다 최종 결과. ** 주문 부분이 무의미한 경우에도 전제 조건은 그대로 유지됩니다. 모든 문자열은 고유합니다. – mark

+0

@mark : 전혀 차이가 없습니다. 귀하의 솔루션 **은 여전히 ​​작동하지 않습니다 **. 모든 문자열이 고유하지만 솔루션이 여전히 ** 실패 **하여 예상 결과를 얻을 수있는 또 다른 예제를 쉽게 찾을 수 있습니다. –

+0

왜 그런가요? ''mmmABmmmmBBmmmBB''가'True'입니다. – mark

관련 문제