2013-12-22 3 views
0

파이썬 응용 프로그램에서 regex를 사용하고 있습니다.오직 파이썬 정규식과 최신 문자열을 받아들입니다

정규식을 사용하여 실행되는 문자열에 많은 행이 포함되어 있습니다.

문자열 (내가 사용하는 문자열의 일부) :

36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.8/86.2 M 278.57 K 1m52s 
36% [============>      ] 55.8/86.2 M 278.57 K 1m52s 
36% [============>      ] 55.8/86.2 M 278.57 K 1m52s 
36% [============>      ] 56.2/86.2 M 426.19 K 1m12s 
36% [============>      ] 56.2/86.2 M 426.19 K 1m12s 
36% [============>      ] 56.2/86.2 M 426.19 K 1m12s 
36% [============>      ] 56.7/86.2 M 504.32 K 1m 0s 
36% [============>      ] 56.7/86.2 M 504.32 K 1m 0s 
36% [============>      ] 56.7/86.2 M 504.32 K 1m 0s 
36% [============>      ] 57.1/86.2 M 409.67 K 1m13s 
36% [============>      ] 57.1/86.2 M 409.67 K 1m13s 
36% [============>      ] 57.1/86.2 M 409.67 K 1m13s[2K 
36% [============>      ] 57.6/86.2 M 453.01 K 1m 5s[2K 
36% [============>      ] 57.6/86.2 M 453.01 K 1m 5s 

문자열은 파일에서 비롯됩니다. 첫 번째 줄에서

(.*%) (.*) (.*)/(.*) (M) (.*) (.*) 

내가 다시 (파이썬 정규식 라이브러리)에서 데이터를 받아 만 인쇄 데이터 :

나는이 (파이썬) 정규식을 사용하여.

마지막 줄의 데이터를 원합니다.

자세한 내용은 : 당신이 말한대로 내가 GNU/리눅스와 파이썬 버전을 사용

2.7.5

+0

당신이 물어 보는 문제는 아니지만'.'는 개행을 제외한 모든 것에 매치됩니다. 여기에는 공백이 포함됩니다. regex가 원하는 것을 캡처하는지 확신합니까? – user2357112

+0

'$'앵커의 끝을 추가 할 수 있습니다. 'last = re.search (r '(. * %) (. *) (. *)/(. *) (M) (. *) (.*) $ ', s) .group()' – hwnd

답변

1

, 당신은 마지막 줄에서 데이터를 원하고, 당신은 정규식을 사용하고 있습니다. 따라서 문자열에서 원하지 않는 모든 콘텐츠를 먼저 제거해야합니다.

은의이 같은 content 변수를 정의 할 수 있습니다 :

이 경우
content = '36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
36% [============>      ] 55.5/86.2 M 426.62 K 1m14s 
[...]' 

, 당신은 마지막 줄을 얻고 그것에 당신의 정규식을 적용 content.splitlines()[-1]을 수행해야합니다. 이 방법은 두 가지 장점이 있습니다.

  1. 결과가 예상됩니다.
  2. 정규 표현식이 더 작은 문자열에서 실행되므로 더 빠릅니다.
+0

귀하의 솔루션을 실행했지만 데이터가 없었기 때문에 결과가' '분할되었습니다. –

+0

'split ('\ n') 대신'splitlines()'를 시도하십시오. 문자열에 \ n이 (가) 있습니까? –

+0

함수를 사용자 정의한 후에 'splitlines()'로 실행해도 여전히 작동하지 않습니다. –

0

는 만 3 정규식 리터럴, %, /M을 보여줍니다.
상위가 제거 된 경우 정규 표현식은 .*%.*.*/.*M.*.*
이되어 .*%.*/.*M.*으로 줄어 듭니다. 당신은 단지 거기에 %, /M와 마지막 줄을 원하는 경우에

, 줄 바꿈 (보통 기본값)과 일치하지 않는

(?-s).*%.*/.*M.*\s*$

(?-s) 수정이 점을 보장으로 변경합니다.
멀티 라인 한정자 (보통 기본값)
을 사용하면 $은 문자열의 끝을 의미합니다.

그룹을 추가하여 원하는 것을 캡처하십시오.

관련 문제