2016-11-22 4 views
0

에서 정규식을 사용하여 문자열의 하위 문자열 전에 공간을 추가나는 두 개의 목록이 파이썬

내가 list_1에서 요소를 가지고 list_2의 문자열에서 검색 할
list_1 = ["TP", "MP"] 

list_2 = ["This is ABC12378TP0892S3", "This is XYZ12378MP0892S3"] 

. 찾을 경우 (예 : TPlist_2의 첫 번째 문자열에있는 경우 MPlist_2의 두 번째 문자열에 있음) TP, MP 등의 오른쪽에있는 것을 제거하고 왼쪽에 공백을 삽입하십시오.

나는 re로 아래했지만, 단지 오른쪽 부분을 제거하고 :

[ re.sub(r'(' + '|'.join(list_1) + ')\d+', r'\1', string) for string in list_2 ] 

답변

1

로 당신은 정규 표현식을 컴파일 할 수 있음을 교체 한 다음 각 목록에 sub()을 수행하는 데 사용 항목 :

import re 

list_1 = ["TP", "MP"] 
list_2 = ["This is ABC12378TP0892S3", "This is XYZ12378MP0892S3", "SDTP This is ABC12378TP0892S3"]  

re_sub = re.compile(r'(.*\b\w+)({}).*'.format('|'.join(list_1))).sub 
list_2 = [re_sub(r'\1 \2', t) for t in list_2] 

print list_2 

이는 것 디스플레이 :

['This is ABC12378 TP', 'This is XYZ12378 MP', 'SDTP This is ABC12378 TP'] 
이 예에서

, 사용되는 검색 패턴은 다음과 같습니다 @

(.*\b\w+)(TP|MP).* 
+0

[re_2 (t)에 대해] [list_2]에 설명해 주실 수 있겠습니까? 그것은 정확히 어떻게 작동하고 있습니까? –

+0

검색 패턴에는'(.... ....) 두 세트가 있습니다. 'sub()'를 사용할 때'\ 1 '은 현재 위치를 첫 번째'()'의 내용으로 대체하고 두 번째'()'의 내용을'\ 2'로 대체하는 것을 의미합니다. –

0

당신이 가까웠다 생각합니다. 중, \d+에 대해 r' \1'

확실하지 공간을 추가 ... 그래서 다음과 같이 .*

>>> [ re.sub(r'(' + '|'.join(list_1) + ').*', r' \1', string) for string in list_2 ] 
['This is ABC12378 TP', 'This is XYZ12378 MP'] 
+0

크리켓-007 내가 두 문자열이 있고 난 단지 one.Example list_1 = [ "TP"에 공백을 삽입하려는 경우, "MP" ] list_2 = [ "SDTP This is ABC12378TP0892S3", "This is XYZ12378MP0892S3"] SDTP를위한 공간을 삽입하고 싶지 않습니다. –

+0

이것이 당신의 질문이라면, 처음부터 질문했을 것입니다 ... "\ 1"대신에 "\ 2"가 필요하기 때문에리스트 이해력을 할 수 없습니다 –

+0

@ cricket-007 SDTP는 문자열의 어느 위치에서나 발생할 수 있습니다. 정교하게 제발 주시겠습니까? –

관련 문제