2016-09-24 91 views
1

我想檢查一個字符串是否以不同數字的小數結尾,從搜索一段時間後,我發現最接近的解決方案是將值輸入到一個元組中,作爲endswith()的條件。但是有沒有更簡單的方法,而不是輸入每種可能的組合?檢查一個字符串是否以Python中的小數結尾2

我試圖編碼最終條件,但如果列表中有新元素,它不會爲那些工作,我也嘗試使用正則表達式它返回其他元素與小數元素一起以及。任何幫助,將不勝感激

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"] 

for e in list1: 
    if e.endswith('.0') or e.endswith('.98'): 
     print 'pass' 

編輯:對不起應該已經指定,我不希望有「QWE -70」被接受,只能用小數點這些元素應該被接受

+0

有啥小數的定義是什麼?爲什麼不是1.01小數。 – Daniel

+1

它看起來每個字符串中的數字都被一個空格分隔,所以爲什麼不只是'float(e.split()[ - 1])',並且在引發'ValueError'時返回false? – ozgur

回答

2

我想提出另一種解決方案:使用regular expressions搜索爲結尾小數。

您可以使用以下正則表達式[-+]?[0-9]*\.[0-9]+$定義一個結尾小數的正則表達式。

正則表達式碎裂開:

  • [-+]?:可選 - 或開頭+符號
  • [0-9]*:零個或多個數字
  • \.:所需點
  • [0-9]+:一個或多個數字
  • $:必須在行末

然後我們可以測試正則表達式,看它是否匹配任何成員的名單:

import re 

regex = re.compile('[-+]?[0-9]*\.[0-9]+$') 
list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70", "test"] 

for e in list1: 
    if regex.search(e) is not None: 
    print e + " passes" 
    else: 
    print e + " does not pass" 

輸出爲前面的腳本如下:

abcd 1.01 passes 
zyx 22.98 passes 
efgh 3.0 passes 
qwe -70 does not pass 
test does not pass 
+0

完美地工作,只接受帶小數點的元素。謝謝 – SSY

0

你的榜樣數據留下了許多可能性敞開:

最後一個字符是一個數字:最後一個空間後

e[-1].isdigit() 

一切是一個數字:

try: 
    float(e.rsplit(None, 1)[-1]) 
except ValueError: 
    # no number 
    pass 
else: 
    print "number" 

使用正則表達式:

re.match('[.0-9]$', e) 
+0

這將接受我不想要的'qwe -70',只有​​其他3個應該被接受 – SSY

0
suspects = [x.split() for x in list1] # split by the space in between and get the second item as in your strings 

# iterate over to try and cast it to float -- if not it will raise ValueError exception 

for x in suspects: 
    try: 
     float(x[1]) 
     print "{} - ends with float".format(str(" ".join(x))) 
    except ValueError: 
     print "{} - does not ends with float".format(str(" ".join(x))) 

## -- End pasted text -- 

abcd 1.01 - ends with float 
zyx 22.98 - ends with float 
efgh 3.0 - ends with float 
qwe -70 - ends with float 
+0

這會返回'qwe -70',但我只想讓列表中有小數點的那些元素像其他3 – SSY

+0

如果你想檢查一個數字是否是整數,你可以使用is_integer方法浮點數。檢查小數點可能需要regex或再次分割並檢查。 https://docs.python.org/2/library/stdtypes.html#float.is_integer –

0

,我認爲這會爲這種情況下工作:

regex = r"([0-9]+\.[0-9]+)" 

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"] 

for e in list1: 
    str = e.split(' ')[1] 
    if re.search(regex, str): 
     print True #Code for yes condition 
    else: 
     print False #Code for no condition 
0

由於你正確的猜測,endswith()不是一個很好的方法來看待解決方案,因爲組合的數量基本上是無限的。要走的路是 - 正如許多人所建議的那樣 - 一個正則表達式,它將字符串的末尾匹配成小數點後跟任意數字的位數。除此之外,保持代碼簡單易讀。strip()是在那裏,以防萬一輸入字符串在最後有額外的空間,這將不必要地複雜正則表達式。 https://eval.in/649155

import re 
regex = r"[0-9]+\.[0-9]+$" 

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"] 

for e in list1: 
    if re.search(regex, e.strip()): 
     print e, 'pass' 
0

的可能流動的幫助: 您可以在行動看到這個

import re 

reg = re.compile(r'^[a-z]+ \-?[0-9]+\.[0-9]+$') 

if re.match(reg, the_string): 
    do something... 
else: 
    do other... 
相關問題