2017-02-06 1 views
0

이것은 샘플 코드입니다.어떻게 파이썬에서 정규식으로 값을 얻을 수 있습니까?

int myCodeVersion = 100; 

내 .py 코드는 다음과 같습니다.

fp = open(path, 'r').read() 
myCodeVer = ''.join(map(str, re.findall('myCodeVersion'+ '\s=\s(.*?) ', fp))) 
print 'My Code version: ' + myCodeVer 

이것은 내가 아래에만 자리를 인쇄 할 내 평 코드

My Code version: 100; 

의 결과입니다.

My Code version: 100 

어떻게하면 정규식을 고칠 수 있습니까? 특정 파일

답변

2
myCodeVer = ''.join(map(str, re.findall('myCodeVersion'+ '\s=\s(\d*)', fp))) 
+0

Thx. 그러나 공백을 제거하십시오. –

+0

re.findall ('myCodeVersion \ s * = \ s * (\ d +)', fp) [0]'이면 충분합니다. 사실,'\ d *'는 틀리며 적어도'\ d +'이어야합니다. 덕분에 – DyZ

+0

. 공백을 제거했습니다. –

2

그렇게처럼 작업을 수행 할 수 있습니다

import re 

with open(file, 'r') as f: 
    myCodeVer = re.findall('(?<=myCodeVersion)(?:\s*=\s*)(\d+)', f.read()) 
    print 'My Code version: ' + myCodeVer[0] 

출력 :

My Code version: 100 

정규식 :

(?<=myCodeVersion) - 긍정적 인 모습 뒤의 myCodeVersion

(?:\s*=\s*) -이 일할 수있는

0

캡처 1 이상의 숫자 - 비 캡처 그룹, =

(\d+)의 양쪽에 0 이상의 공백 :

.*\s*=\s*(.*?); 
0

약간 더 일반적인 접근 방식이 될 것입니다 그룹을 포착 할 수 있습니다. 예를 들어, 다음과 같이 우리는 변수 유형, 이름과 패턴 매처를 사용하여 그룹과 같은 값을 캡처 할 수 있습니다 :

s = 'int myCodeVersion = 100;' 
import re 
# compile the regex pattern, if you need to use multiple times, it will be faster 
pattern = re.compile(r"(int|float|double)\s+([A-Za-z][A-Za-z0-9_]+)\s*=\s*(\d+)\s*;") 
m = re.match(pattern, s) 
print 'var type: ' + m.group(1) 
print 'var name: ' + m.group(2) 
print 'var value: ' + m.group(3) 
#var type: int 
#var name: myCodeVersion 
#var value: 100 

을 당신이 동일한 방법을 사용하여 다음과 같이 단순화 할 수있는 코드에 관심이있는 특정 경우를 들어 :

pattern = re.compile(r"int\s+myCodeVersion\s*=\s*(\d+)\s*;") 
print 'My Code version: ' + ''.join(map(str, re.match(pattern, s).group(1))) 
# My Code version: 100 
관련 문제