2016-08-13 4 views
1

오늘 내 regex-fu는 약하다. 문자열 형식의 그룹을 다음과 같은 형식으로 5 부분으로 캡처하려고합니다.정규식 그룹으로 분할

substring delimiter substring number(space) substring 

단어 경계를 사용해 보았지만 성공하지 못했습니다. . 그것을 얻을 수 있기 때문에

import re 

s = "FOREVER - Alabaster Cuttlefish - 01 This Style Is Cheese" 

m = re.compile("(.*)(\s-\s)(\d{1,3}\s)(.*)") 
g = m.match(s) 
if g: 
    print m.match(s).group(1) # FOREVER 
    print m.match(s).group(2) # - 
    print m.match(s).group(3) # Alabaster Cuttlefish 
    print m.match(s).group(4) # 01 

    # fail 
    # print m.match(s).group(5) # This Style Is Cheese 

그룹 5가 존재하지 않습니다 내가 * 사용에 의존 한 (내가 알고, 탐욕과 게으름) 여기에 모든

에서 작동하지 않는 것보다 조금 더있는 내가 가진 무엇 첫 번째 그룹에서 캡처합니다. 그러므로 나는 당혹 스럽다.

답변

2

아주 가까이 있습니다. 와 정규 표현식 교체 : 당신이 설화 석고 오징어의 끝에 후행 대시를하지 않으려면,

m = re.compile("(.*?)(\s-\s)([^\d]*)(\d{1,3}\s)(.*)") 

을 사용 :

import re 

s = "FOREVER - Alabaster Cuttlefish - 01 This Style Is Cheese" 

m = re.compile("(.*)(\s-\s)(.*)(\s-\s)(\d{1,3}\s)(.*)") 
g = m.search(s) 
if g: 
    print g.group(1) # FOREVER 
    print g.group(2) # - 
    print g.group(3) # Alabaster Cuttlefish 
    print g.group(5) # 01 
    print g.group(6) # This Style Is Cheese