2013-08-18 4 views
1

크로스 플랫폼 개행 패턴을 따르는 개행을 포함하는 문자열에서 개행 수를 세는 가장 쉬운 방법은 무엇입니까? '\r\n?|\n'입니다.크로스 플랫폼 개행 패턴을 계산하는 가장 쉬운 방법

공백을 없애거나 버퍼의 다른 문자를 건너 뛰고 있지만 평균 시간은 입니다. 줄 수를 증가시키고 싶습니다.

nlinePat = re.compile(r'\r\n?|\n') 

wsPat = re.compile(r'[ \t\r\n]+') # skip (specific) white space chars 
commaPat = re.compile(r'[ \t\r\n]*,[ \t\r\n]*') # skip comma and surrounding white space 
#... 

m1 = wsPat.match(buffer) 
bufferPos += len(m1.group(0)) 

m2 = nlinePat.findall(m1.group(0)) 
nlineCounter += len(m2)) 

: 무슨 '

+0

크로스 플랫폼이란 플랫폼에 구애받지 않으며 (파일에서 행 분리 기호를 읽음) 시스템에서 결정합니다 (예 : 플랫폼이 Linux 인 경우 '\ n'으로 가정). – Blender

+0

플랫폼 불가지론 자 - 가능한 세 가지 패턴의 개행 패턴은 개행 문자로 간주됩니다. –

+0

나는 당신이 성취하려는 것을 확실히 모르겠습니다. 모든 사례를 다루는 입력 예제를 제공하고 계산 방법을 보여줄 수 있습니까? –

답변

1

를 (예를 들어 위가 하나의 정규식 작업을 사용하여 수행 할 수 있습니다, 내가 그들을 계산 먼저 줄 바꿈을 건너 뛸 오버 헤드의 느낌이) 내가 좋아하는 일을하고 있어요 다시하는 것이 꽤 좋다. 또 다른 방법은 버퍼를 nlinePat에 분할하고 각 라인을 처리하는 것입니다. 라인을 처리 할 때마다 nlineCount에 1을 더할 수 있다는 것을 알고 있습니다. 내 솔루션은 당신이 문자의 수를 추적하지 않을 것임을 의미합니다 (분할이 하나 또는 두 개의 문자로 나뉘어져 있고 공백 문자가 얼마나 많이 제거되었는지 모르기 때문입니다).

"파이썬에서"이렇게하는 방법을 찾기가 어려울 것이라고 생각합니다. 한 번에 두 개 이상의 작업을 수행해야합니다 (줄 바꿈 및 카운트 문자 계산). 따라서 문자별로 구문 분석해야합니다. 당신 자신.

내 예 :

#!/usr/bin/env python 

import re 

buffer = ''' 
\tNow is the time\t 
for all good men\r\tto come to the aid\t\r 
of their party. 
''' 


nlinePat = re.compile(r'\r\n?|\n') 

bufferPos = 0 
nlineCounter = 0 

bl = nlinePat.split (buffer) 

for line in bl: 
    print(line.strip()) 
    nlineCounter += 1 

print nlineCounter 
3

당신이 원하는 모든 상관없이 표현하는 방법, 줄 바꿈을 계산하는 경우 ('\ r에'를, '\ 연구 \ n', '\ n')를 Universal newline 모드 ('rU')에서 파일을 열면 모든 개행 문자가 '\ n'문자로 나타납니다 (따라서 '\ n'문자 만 계산하면됩니다).

CSV를 구문 분석하려는 경우 이미 Python에 내장 된 CSV 모듈을 사용하십시오 (예 : Handling extra newlines (carriage returns) in csv files parsed with Python? 참조).