이 몇 가지 방법이를 달성하기 위해.
patterns = ["ave", "avenue", "road", "street"]
string = 'queen ave west'
reduce(lambda s, pat: s[:s.find(pat)+len(pat)] if s.find(pat) > 0 else s, patterns, string)
그러나 정규 표현식의 사용을 통해 어쩌면 더 나은 해결 방법 : reduce
여기 significene이있는 경우,이 하나 lambda
내 대답을 유지하는 방법입니다.
여러 주소로이를 적용하는 경우
import re
patterns = ["ave", "avenue", "road", "street"]
regex = r'(.*)(' + '|'.join(patterns) + r')(.*)'
string = 'queen ave west'
re.sub(regex, r'\1\2', string)
, 당신은 컴파일하여 코드를 최적화 할 수 있습니다 : 이것은 하나의 정규 표현식으로 가능 "패턴"을 모두 결합하여 파이썬의 정규 표현식 엔진을 통해 한 번에 모든 일을 실행 정규 표현식은 먼저 당신이 정리하려는 각 주소에 컴파일 된 정규식을 사용하여 :
import re
patterns = ["ave", "avenue", "road", "street"]
regex = re.compile(r'(.*)(' + '|'.join(patterns) + r')(.*)')
strings = ['queen ave west', 'should stay the same']
sanitized_strings = (regex.sub(r'\1\2', string) for string in strings)
이제 sanitized_strings 문자열의 버전을 청소 포함되어 있습니다. for 루프를 사용하여 sanitized_strings을 반복하고 인쇄하거나 필요한 작업을 수행 할 수 있습니다. patterns
에있는 단어가 없으면 전체 문자열이 첫 번째 그룹과 일치합니다. 따라서 단어가 없으면 요청한 것처럼 문자열을 변경하지 않습니다.
나는 당신이 찾고있는 것과 정확히 일치하지는 않습니다. 예를 들어, 정말로 'queen ave'를 'queen ave west'로 반환하고 싶습니까? 패턴 중 하나가 거리의 이름 일 때 패턴을 'st'로 또는 예를 들어 토론토에서 패턴을 나타내는 경우 매우 가능성이 높습니다. '애비뉴로드'라고 불렀습니다. 그 질문에 대한 답은 당신이 성취하고자하는 것에 달려 있습니다.
이 효율적 소리가 나지 않는다 구분 기호 단어를 다시 추가 할 때 알고 감소와 필터이다 , 당신은'patterns' 배열을 반복 할 수 있고,'id = s.split.index (patterns [i])'그리고 나서'string = s [: id]'를 마침내'return ''.join (string)'하지만 꽤 귀엽다. ficient imo. 아마도 이것을 최적화 할 수있을 것입니다. –