2013-02-28 2 views
0

기본적으로 나는 여러 줄이 있지만 '@'기호가없는 방대한 텍스트 파일을 가지고 있습니다.파이썬에서 주어진 패턴을 포함하는 선 앞에 모든 줄을 인쇄하려고 시도합니다.

나는 '@'기호 하나만있는 FIRST 행 앞에 오는 모든 행을 인쇄하려고합니다.

저는 파이썬에 익숙하지만 정규식에 꽤 익숙하지만 저는 이것을 알아낼 수 없습니다. 여기에 지금까지있어 무엇 :

original = open('oldfile.txt') 
for each_line in original: 
    pattern = re.compile("(^.*)(^@\s)", re.M) 
    m = re.match(pattern, each_line).group(1) 
    print(m) 

original.close 

내가 한 시간 반 동안 파이썬 온라인 워드 프로세서 및 기타 유래 기사를 읽고있다 어떻게 든 난 아직이을받지 못했습니다 맹세합니다.

그 코드의 결과는 다음과 같습니다

AttributeError: 'NoneType' object has no attribute 'group'

+0

첫 줄이 __precedes__입니까? – GordonsBeard

+0

첫 번째 줄 앞에 오는 * 하나의 '@'기호 * – mgilson

답변

3

현재 정규 표현식을하지 않아도, 그것은 실제로 매우 간단합니다

with open('file.txt') as file: 
    for line in file: 
     line = line.rstrip("\n") 
     if line == "@": 
      break 
     print(line) 

우리는 with 문을 사용하여 파일을 (열하는 가독성이 높고 예외가 발생하더라도 파일이 닫혔는지 확인), 파일의 행을 반복합니다. 줄이 단지 "@" 인 경우 루프에서 빠져 나오고 그렇지 않으면 줄을 인쇄하고 계속합니다.

으로는 의견에서 지적, 우리는 오프라인 개행 문자를 제거 (또는 우리가 우리는 또한에 2.X에서 3.X에 print(line, end="") 또는 print line,을해야 할 것이라고 한 경우 ("@\n"에 대해 확인해야 조건이 충족 될 때까지) 추가로 줄 바꿈을 추가 print()를 중지합니다.

을 마티 Piters가 지적 하듯이,이 작업을 수행하는 또 다른 방법이의 takewhile() 기능을 사용 itertools에서.이 정확히 무엇이다, 반복 가능에서 항목을 걸립니다 우리 원하는 곳 :

import itertools 

with open('file.txt') as file: 
    for line in itertools.takewhile(lambda x: x != "@\n", file): 
     print(line, end="") 

필자는 값을 출력하는 것만으로는 읽기가 더 어렵다고 주장 할 것입니다. 그러나 유용 할 수도 있습니다 (예를 들어, 값의 목록을 만들거나 다른 함수로 전달하려는 경우, iterable로 유용하다).

+1

이제'.takewhile()'예제를 추가하십시오. :-) –

+1

문자열 리터럴에 개행 문자가 누락되었습니다. – mgilson

+0

그냥 시도했는데 그 결과는 원래 전체 원본 파일이었습니다. – user1825081

0

Lattyware에서 언급했듯이 정규식이 필요하지 않습니다.

문자열의 패턴과 일치하지 않을 때 코드의 문제인 경우 re.match은 일치 개체가 아닌 None을 반환합니다. 이 경우 group 속성을 호출 할 수 있습니다. 그것이 예외 이유 : NoneType 유형의 인스턴스 ( 인스턴스) 인 None에는 group이라는 특성이 없습니다.

또한 re.compile 문은 루프 외부에 있어야합니다. 그렇지 않으면 정규 표현식을 명시 적으로 컴파일하는 데 많은 포인트가 없습니다.

관련 문제