2012-09-11 2 views
1

그래서 저는 여전히 regex와 python을 가진 초보자입니다. 나는 약간의 시간을 찾고 있었지만 내가 무엇을 찾고 있는지를 묻는 방법을 모른다.Python - regex를 사용하여 사용자 데이터 얻기

형식화 된 문자열에서 데이터를 목록 또는 사전으로 가져와야합니다.

------------------------------------------------------------------- 
Frank   114  0   0   0   0   114  
Joe   49  1   0   0   0   50   
Bob   37  0   0   0   0   37   
Sally   34  2   0   0   0   36  

이것은 스크립트의 출력입니다. 현재 내가 가지고 : 나는 match_list 수익을 가질 필요가 있음을 제외하고

match_list = [] 
match = re.search('\n(\w+)\s+(\d*)\s+(\d*)', output) 
    if match: 
    match_list.append([match.group(1), 
         match.group(2), 
         match.group(3)]) 
>>>print match_list 
[['frank', '114', '0']] 

이, 완벽 :

match.group (1) 인 경우 내 초기 생각은 루프 및 확인했다
[['frank', '114', '0'], 
['Joe', '49', '1'], 
['Bob', '37', '0'], 
['Sally', '34', '2']] 

이미 열거 된 경우, 다음 단계로 넘어갈 경우, 그 방법을 모른다고 깨달았습니다. 그러나 당신은 그것을 가지고 있습니다. 나는 이것을 알아 내는데 어려움을 겪고있다. 어떤 도움이 환상적 일 것입니다! :)

오. 목록 크기가 변경됩니다. 때로는 한 명의 사용자 만있을 수 있으며 다른 경우에는 20 명의 사용자가있을 수 있습니다. 그래서 거대한 정적 정규식을 설정할 수 있습니다. (내가 아는 것을 ...)

+0

당신이 (할당 요구 사항 등) 정규식을 사용하는이 있거나 작동 아무것도 사용할 수있는 이유가 있습니까? – DSM

+0

아니요, 과제가 아닙니다. 나는 단지 데이터 추적 일 뿐이야. 나는 그것이 매우 유용하다고 말했고, 그것을 더 잘 알고 싶다. 정규 표현식에서 그것을 유지하기를 희망했다. 믿을 수 없을만큼 간단한 방법이 있다면, 나는 그걸로 잘 될 것입니다. – jtsmith1287

답변

4

당신은 re.findall 사용할 수 있습니다 : 당신은 정규식이 필요하지 않습니다

match_list = map(list, re.findall('\n(\w+)\s+(\d*)\s+(\d*)', output)) 
+0

이것은 완벽합니다. 어쨌든 경기를 반복해야했기 때문에 나에게 도움이 될 것입니다. 그것은 또한 내 정규 표현식에 추가하고 부 풀린 목록을 얻지 않고 앞으로 다른 열에서 가져옵니다. – jtsmith1287

3

:

oneliner으로

match_list = [] 
match = re.findall('\n(\w+)\s+(\d*)\s+(\d*)', output) 
for k in match: 
    #k will be a tuple like this: ('frank', '114', '0') 
    match_list.append(list(k)) 

또는 같은 솔루션을

table="""\ 
------------------------------------------------------------------- 
Frank   114  0   0   0   0   114  
Joe   49  1   0   0   0   50   
Bob   37  0   0   0   0   37   
Sally   34  2   0   0   0   36""" 

print [line.split() for line in table.splitlines()[1:]] 

또는 정규식을 원할 경우 :

print [list(t) for t in re.findall(r'^(\w+)'+r'\s+(\d+)'*6,table,re.MULTILINE)] 

어느 케이스, 인쇄 :

[['Frank', '114', '0', '0', '0', '0', '114'], 
['Joe', '49', '1', '0', '0', '0', '50'], 
['Bob', '37', '0', '0', '0', '0', '37'], 
['Sally', '34', '2', '0', '0', '0', '36']] 
+0

이것은'.splitlines()'를 사용했다는 것을 제외하고는 내가 한 것과 비슷합니다. 이것은 정규 표현식이 아닌 데이터가 어떻게 보이는지에 대한 가정을하지만 여전히 이것부터 시작합니다. – DSM

관련 문제