2016-08-01 4 views
3

하나의 특정 단어가 다른 특정 단어로 끝나지 않으면 그대로 두십시오. 여기 내 문자열입니다주어진 문자열에서 두 개의 특정 단어 사이에 단어 인쇄

내가 인쇄하고 died or dead or death 단어의 끝나지 않습니다 john 경우 john 사이 dead or death or died.을 모든 단어를 계산 할
x = 'john got shot dead. john with his .... ? , john got killed or died in 1990. john with his wife dead or died' 

. 그것을 남겨주세요. 존 단어로 다시 시작하십시오.

내 코드 :

x = re.sub(r'[^\w]', ' ', x) # removed all dots, commas, special symbols 

for i in re.findall(r'(?<=john)' + '(.*?)' + '(?=dead|died|death)', x): 
    print i 
    print len([word for word in i.split()]) 

내 출력 :

got shot 
2 
got killed or 
3 
with his wife 
3 

내가 실수를하고있는 중이 야 어디 내가 모르는 : 내가 원하는

got shot 
2 
with his   john got killed or 
6 
with his wife 
3 

출력. 그냥 샘플 입력입니다. 한 번에 20,000 개의 입력을 확인해야합니다.

+0

요점이 명확하지 않다. '존이 죽었거나 존이 '6'으로 계산되기 때문에? –

+0

@ MarlonAbeykoon'존과 그의 ....? 존이 살해 당하거나 사망했다 "는 제 1의 존 단어는'죽은 사람이나 죽음으로 끝나거나 죽지 않았다. 두 번째'존 '단어로 시작하십시오. 내가 원하는 결과물은'죽었거나'죽지 않았거나'그의 생명이 죽거나' –

답변

2

당신이 부정적 예측 정규식을 사용할 수 있습니다.

나는 또한 완전한 단어를 일치하도록 단어 경계를 사용하는 것이 좋습니다 :

re.findall(r'(?<=\bjohn\b)(?:(?!\bjohn\b).)*?(?=\b(?:dead|died|death)\b)', x) 

Code Demo

+1

내 솔루션보다 훨씬 좋은, 이것을 가져 가세요. – jbndlr

+1

이 항목은 모든 입력에 대해 훌륭하게 작동합니다. 감사. –

2

dead|died|death이 발생하기 전에 문자열에 다른 문자가 john 다음에 나오면 다시 시작하겠습니다.

그런 다음 단어 john하여 문자열을 분할하고 나중에 결과 부분에 일치 시작할 수 있습니다

x = 'john got shot dead. john with his .... ? , john got killed or died in 1990. john with his wife dead or died' 
x = re.sub('\W+', ' ', re.sub('[^\w ]', '', x)).strip() 
for e in x.split('john'): 
    m = re.match('(.+?)(dead|died|death)', e) 
    if m: 
     print(m.group(1)) 
     print(len(m.group(1).split())) 

수율 : 또한

got shot 
2 
got killed or 
3 
with his wife 
3 
을, 즉 교체 후 내가 여기 제안주의 (분할 및 일치시키기 전에) 문자열은 다음과 같습니다.

john got shot dead john with his john got killed or died in 1990 john with his wife dead or died 

즉, 시퀀스에 여러 개의 공백이 남아 있지 않습니다. 나중에 이것을 공백으로 나누어서 관리하지만, 조금 더 깨끗하다고 ​​느낍니다. 대신 당신의 .*?

>>> for i in re.findall(r'(?<=john)(?:(?!john).)*?(?=dead|died|death)', x): 
...  print i.strip() 
...  print len([word for word in i.split()]) 
... 

got shot 
2 
got killed or 
3 
with his wife 
3 

이 정규식 (?:(?!john).)*?을 사용 john는이 경기에 존재하지 않는 경우에만 게으르게 모든 문자의 0 개 이상의 일치합니다 :

+0

좋은 해결책 이었지만, 첫 번째 요한까지 그 부분에 대해서는 효과가 없을 것입니다. [1 :] 슬라이싱을 추가하면 좋을 것입니다 : –

+1

문장이 '... dead john'으로 시작하면 (즉, 첫 번째'john '이전에 무언가가 3 개의 정지 단어 중 하나를 포함합니다), 그것도 일치로 취급합니다. 나는 그것을 고쳐 줄 것이다. – jbndlr

+0

감사합니다. 이것은 또한 위대한 작품. –

관련 문제