2014-06-19 3 views
0
with open(searchfile) as f: 

pattern = "\.?(?P<sentence>.*?\(([A-Za-z0-9_]+)\).*?)\." 
for line in f: 
    match = re.search(pattern, line) 
    if match != None: 
     print match.group("sentence") 

내가 괄호 안에 약어를 포함하는 모든 문장을 추출하는 것을 시도하고있다 (괄호 안의 기본적으로 2-4 편지 모두 대문자로파이썬은 괄호를 포함하는 모든 문장을 추출

는 :. 여기 (ABC) 예입니다 이 문장을 포함시키지 말고이 (AB) 하나를 포함하고, (AVCD) 이것을 하나 포함

Out : 여기에 (ABC) 예가 포함되어 있고 이것을 (AVCD) 하나를 포함하십시오

답변

1

다음과 같이 사용할 수 있습니다.

[^.]*?\([A-Z]{2,4}\)[^.]*\. 

그러나 패턴이 매우 허용적인 하위 패턴으로 시작되기 때문에 매우 비효율적 인 방법입니다. 당신은 조금 그 시작 부분에 앵커의 종류를 추가하여 해결할 수 있습니다

(?:(?<=.)|^)[^.]*?\([A-Z]{2,4}\)[^.]*\. 

불행히도을, 심지어이 앵커로, 정규식 엔진이 문자열의 문자의 대부분을위한 두 가지 대안을 선택해야합니다.

#!/usr/bin/python 

import re 

txt = 'Here is an (ABC) example. Do not include this sentence. Include this (AB) one. And (AVCD) this one.' 

pattern = re.compile(r'([!.?])(?=\s)|\([A-Z]{2,4}\)[^.]*(?:\.|$)') 
offset = 0 
result = '' 
for m in pattern.finditer(txt): 
    if (m.group(1)==None): 
     result += txt[offset:m.end()] 
    offset = m.end() 

print result  

참고 : 당신이 할 수 있습니다

더 좋은 방법은 문자열 문장과 도트이 끝날 때까지 약어로 시작, 다음 각 결과의 종료 오프셋 (offset)를 사용하여 문자열을 추출 할 찾을 수 있습니다 점은 문장의 끝을 의미합니다. 그것은 다른 것일 수 있습니다.

+0

작동, 1 : – zx81

+0

어떻게 문자열을이 작업을 수행하지만, 텍스트 파일에서 데이터를 읽고하지 않을까요? 루프를 한 번에 한 줄씩 실행하면 첫 번째 줄만 반환됩니다. – mrobillard

+0

@mrobillard : 쉽게 할 수 있습니다. 필요한 것은'subeol' 변수를 for 루프 (바깥 쪽) 뒤에있는 라인의 끝 (offset부터 end까지)에 저장하는 것입니다. for 루프 내부에서'result'는 이제'result + = subeol + txt [offset : m.end()]'가되고, if 문 다음에'subeol'을 빈 문자열로 초기화해야합니다. 당신은 라인 단위로 모든 것을 넣을 필요가 있습니다. –

0

좀 더 효율적인 패턴

([^.(]++\([^.)]++\)[^.)]++\.) 

Demo