2012-03-26 2 views
0

나는 다음과 같은 문자열의 = "~ VERSION 11 11 11.1 222 22 22.222"파이썬에서이 정규 표현식을 일치시키는 방법은 무엇입니까?

나는 다음과 같은 변수에 다음을 추출 할이 있습니다 :

string Variable1 = "11 11 11.1" 
string Variable2 = "222 22 22.222" 

어떻게이 정규 표현식으로 추출합니까? 아니면 더 나은 대안이 있습니까? (참고, 거기에 내가 추출하고 주인공은 ~ 이외의 수 있습니다 원하는 토큰 사이의 가변 간격이있을 수 있지만, 확실히 상징이 될 것입니다 :

이 예는 수 :

~ VERSION 11 11 11.1 222 22 22.222 
$ VERSION 11 11 11.1  222 22 22.222 
@  VERSION 11 11 11.1   222 22 22.222 

은 정규 표현식이에 대한 이해 또는 더 나은 방법이 있는지, 추천 바랍니다. 을 내가 파이썬에서 두 변수로 추출을 미리 형성 어떻게해야합니까?

+1

'222'가 '22'또는 '11.1'이 아니라 두 번째 변수의 시작임을 어떻게 알 수 있습니까? –

+0

@KarlKnechtel : 저는 그것을 3 개의 숫자로 구성된 두 개의 그룹으로 해석했습니다 (정수와 소수 각각 2 개). 원하는 두 변수는 각각 3 개 필드입니다. –

답변

2

시도 할 수 있습니다이 : 제공

import re 

test_lines = """ 
~ VERSION 11 11 11.1 222 22 22.222 
$ VERSION 11 11 11.1  222 22 22.222 
@  VERSION 11 11 11.1   222 22 22.222 
""" 

version_pattern = re.compile(r""" 
[[email protected]#$%^&*()]    # Starting symbol 
\s+       # Some amount of whitespace 
VERSION      # the specific word "VERSION" 
\s+       # Some amount of whitespace 
(\d+\s+\d+\s+\d+\.\d+)  # First capture group 
\s+       # Some amount of whitespace 
(\d+\s+\d+\s+\d+\.\d+)  # Second capture group 
""", re.VERBOSE) 

lines = test_lines.split('\n') 

for line in lines: 
    m = re.match(version_pattern, line) 
    if (m): 
     print (line) 
     print (m.groups()) 

출력 :

~ VERSION 11 11 11.1 222 22 22.222 
('11 11 11.1', '222 22 22.222') 
$ VERSION 11 11 11.1  222 22 22.222 
('11 11 11.1', '222 22 22.222') 
@  VERSION 11 11 11.1   222 22 22.222 
('11 11 11.1', '222 22 22.222') 

주석이있는 자세한 정규 표현식의 사용에 유의하십시오.

추출 된 버전 번호를 숫자 표현 (int, float)으로 변환하려면 @Preet Kukreti의 답변에 regexp를 사용하고 int() 또는 float()을 제안대로 변환하십시오.

0
import re 
pattern_string = r"(\d+)\s+(\d+)\s+([\d\.]+)" #is the regex you are probably after 
m = re.match(pattern_string, "222 22 22.222") 
groups = None 
if m: 
    groups = m.groups() 
    # groups is ('222', '22', '22.222') 

된 후 int()을 사용할 수없는 경우와필요한 경우 기본 숫자 형식으로 변환하려면을 입력하십시오. 성능이 좋은 코드를 위해 당신은 re.compile(...)에 미리 정규식을 미리 컴파일하려면, 결과 미리 컴파일 된 정규식 개체에 match(...) 또는 search(...)를 호출하면

+0

패턴을 별도로 정의하는 경우 ('pattern_string = r '....') 그러면 어쨌든 컴파일 할 수 있습니다. –

0

정규식으로 분명 쉽습니다. 여기에 한 가지 방법이 있습니다.

>>> st="~ VERSION 11 11 11.1 222 22 22.222 333 33 33.3333" 
>>> re.findall(r"(\d+[ ]+\d+[ ]+\d+\.\d+)",st) 
['11 11 11.1', '222 22 22.222', '333 33 33.3333'] 

결과가 목록에 있으면 색인을 생성하고 개별 문자열을 가져올 수 있습니다.

1

String의 split 메소드를 사용할 수 있습니다.

v1 = "~ VERSION 11 11 11.1 222 22 22.222" 
res_arr = v1.split(' ') # get ['~', 'VERSION', '11', '11', '11.1', '222', '22', '22.222'] 

원하는대로 요소 2-4와 5-7을 사용하십시오.

+0

당신의보기는 경미하게 어리 석다. 'v1.split()'은'[ '11', '11', '11.1']'를 줄 것입니다. –

+0

'str.split()'은 버전 스트링이 항상 같은 형식을 취할 수있는 한 가장 빠르며 (가장 우아한?) 해결책입니다. 정규 표현식은 비트를 꺼내서 사용하기 전에 전체 라인이 예상 한대로 포맷되어 있는지 확인할 수 있기 때문에 좋습니다. –

관련 문제