2008-12-22 39 views
24

Làm cách nào để trích xuất giá trị kép từ chuỗi bằng regex.Trích xuất phao/giá trị kép

import re 

pattr = re.compile(???)  
x = pattr.match("4.5")  
+0

thể bạn cung cấp một số chi tiết trên tại sao bạn không thể sử dụng float ("4.5")? – jfs

Trả lời

20

Dưới đây là một cách dễ dàng. Không sử dụng regex cho các loại built-in.

try: 
    x = float(someString) 
except ValueError, e: 
    # someString was NOT floating-point, what now? 
+0

Thực ra, đây cũng là cách an toàn nhất. Hãy xem xét một số đầu vào sai, như '0..1',' 0.0.02', rất khó để regex nhận ra nó. Điều tệ hơn là, nó sẽ giả vờ nó đúng và tạo ra một số câu trả lời sai. – dspjm

+0

Về mặt kỹ thuật chính xác, nhưng câu hỏi chỉ định rõ ràng regexp. – VillasV

45

Một regexp từ perldoc perlretut:

import re 
re_float = re.compile("""(?x) 
^
     [+-]?\ *  # first, match an optional sign *and space* 
     (   # then match integers or f.p. mantissas: 
      \d+  # start out with a ... 
      (
       \.\d* # mantissa of the form a.b or a. 
     )?  # ? takes care of integers of the form a 
     |\.\d+  # mantissa of the form .b 
    ) 
     ([eE][+-]?\d+)? # finally, optionally match an exponent 
    $""") 
m = re_float.match("4.5") 
print m.group(0) 
# -> 4.5 

Để trích xuất số điện thoại từ một chuỗi lớn hơn:

s = """4.5 abc -4.5 abc - 4.5 abc + .1e10 abc . abc 1.01e-2 abc 
     1.01e-.2 abc 123 abc .123""" 
print re.findall(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?", s) 
# -> ['4.5', '-4.5', '- 4.5', '+ .1e10', ' 1.01e-2', 
#  '  1.01', '-.2', ' 123', ' .123'] 
+2

Biểu thức tìm thấy là kinh doanh, nhờ – reabow

1

một phao như cụm từ thông dụng trong lực lượng vũ phu. có sự khác biệt nhỏ hơn phiên bản của JF Sebastian:

import re 
if __name__ == '__main__': 
    x = str(1.000e-123) 
    reFloat = r'(^[+-]?\d+(?:\.\d+)?(?:[eE][+-]\d+)?$)' 
    print re.match(reFloat,x) 

>>> <_sre.SRE_Match object at 0x0054D3E0> 
+0

Điều này không khớp với phao không có phần nguyên, ví dụ: '.123' thay vì' 0.123'. –

9

Đối với phân tích cú pháp int và float (điểm separator) giá trị:

re.findall(r'\d+\.*\d*', 'some 12 12.3 0 any text 0.8') 

kết quả:

['12', '12.3', '0', '0.8'] 
+0

Nếu bạn có thể cung cấp một thủ tục để có được int hoặc float nhưng không có nó trong một từ điển hoặc mảng thì nó sẽ hữu ích. những gì tôi có 'str1 =" BIOS: phiên bản 2.0.0 "' những gì tôi muốn '2.0.0' không có bất kỳ dấu phẩy hoặc dấu ngoặc nào. –

+1

Xin chào, bạn có thể sử dụng như: re.findall (r '[\ d \.] +', "BIOS: phiên bản 2.0.0") –

+0

tốt hơn: re.findall (r '[\ d \.] {2, } | \ d + ', "BIOS: phiên bản 2.0.0") –

Các vấn đề liên quan