2017-01-11 5 views
1

구분 된 텍스트이지만 정규식으로 파싱하고 싶습니다.일치하는 모든 그룹을 얻으려면 Python re.findall()을 사용하십시오.

두 번째 열 및 다음 초 또는 밀리 초가 걸립니다.

>>> import re 
>>> s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s) 

출력 (예상 답) :

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')] 

내가 좋아하는 한정사를 사용하여이 패턴을 짧게 만들고 싶어 * 또는 {X, Y}.

그래서 내가 그랬어 : 나는 실패

>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr) 

[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')] # WRONG 

.

어떻게이 정규식 패턴을 수행 할 수 있습니까?

답변

1

당신은 당신이 정규식 그룹의 변수 번호를 사용할 수 있는지 여부에 대해 묻는 것 같다. 빠른 Google 검색을 기반으로 대답은 '아니요'로 표시됩니다. 정규식은 전체 패턴과 일치하지만 같은 그룹의 반복되는 일치에 대해 마지막 값만 기록됩니다.

간단히 s.split('|')을 수행 한 다음 각 하위 문자열에 필요한 검사를 수행하십시오.

+0

알겠습니다. 고맙습니다. – ijmo

0
import re 

s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 

print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s)) 

출력 :

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]