2010-12-29 43 views
10

Tôi có một chuỗi như "GoTo: 7018 6453 12654\n" Tôi chỉ muốn có được một cái gì đó giống như số ['7018', '6453', '12654'] này, tôi cố gắng biểu hiện thường xuyên nhưng tôi không thể tách chuỗi để có được chỉ số ở đây là mã của tôi:Tách chuỗi và chỉ nhận số trong python?

Mẫu 1:

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

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

mẫu 2:

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

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

Trả lời

13

Nếu tất cả các số của bạn là số nguyên dương, bạn có thể làm điều đó mà không cần biểu thức thông thường bằng cách sử dụng phương pháp isdigit():

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

+1 cho người không tái. Người ta có thể dễ dàng ném 'int (item) 'vào đó, nếu điều này là cần thiết sau này. – plundra

+0

Đã làm một số 'timeit' ... Nếu chia + isdigit là giá trị cơ bản (nó là nhanh nhất), biên dịch re.findall là 1,5 lần chậm hơn và uncompliled re.findall 2.5. – plundra

+0

Điều này chỉ hoạt động nếu dấu phân cách là khoảng trống thuần túy (ví dụ: "1, 2, 3" sẽ phá vỡ nó) – 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

Bạn có thể làm theo phương pháp hiện tại của bạn trong mẫu 1 cùng với mã này:

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

Hãy thử điều này:

import re 
splitter = re.compile(r'\d+') 
match1 = splitter.findall("GoTo: 7018 6453 12654\n") 
print match1 
Các vấn đề liên quan