2010-12-29 8 views
10

mam ciąg jak "GoTo: 7018 6453 12654\n" Chcę uzyskać numer coś takiego ['7018', '6453', '12654'], ja próbuje wyrażenie regularne, ale nie mogę podzielić ciąg dostać tylko numer tutaj jest mój kod:Podziel ciąg i po prostu uzyskać numer w python?

Próbka 1:

splitter = re.compile(r'\D'); 
match1 = splitter.split("GoTo: 7018 6453 12654\n") 

my output is: ['', '', '', '', '', '', '', '', '7018', '6453', '12654', ''] 

Próbka 2:

splitter = re.compile(r'\W'); 
match1 = splitter.split("GoTo: 7018 6453 12654\n") 

my output is: ['GoTo', '', '7018', '6453', '12654', ''] 

Odpowiedz

13

Jeśli wszystkie liczby są liczbami całkowitymi dodatnimi, można to zrobić bez wyrażenia regularne przy użyciu metody isdigit():

>>> text = "GoTo: 7018 6453 12654\n" 
>>> [token for token in text.split() if token.isdigit()] 
['7018', '6453', '12654'] 
+2

+1 dla non-Re. Można łatwo rzucić tam również "int (item)", gdyby było to później potrzebne. – plundra

+0

Czy niektóre 'timeit' ... Jeśli split + isdigit jest wartością podstawową (jest to najszybszy), skompilowane re.findall jest 1,5 razy wolniejsze i nieskompilowane re.findall 2.5. – plundra

+0

Działa to tylko wtedy, gdy separator jest czystym odstępem (na przykład może to być "1, 2, 3") – 6502

3
>>> import re 
>>> re.findall("[0-9]+", "GoTo: 7018 6453 12654\n") 
['7018', '6453', '12654'] 
>>> 
6
>>> re.findall(r'\d+', 'GoTo: 7018 6453 12654\n') 
['7018', '6453', '12654'] 
2

Możesz śledzić aktualną metodę w próbce 1 wraz z tym kodem:

filter (lambda a: a != '', match1) 
1

Spróbuj tego:

import re 
splitter = re.compile(r'\d+') 
match1 = splitter.findall("GoTo: 7018 6453 12654\n") 
print match1