2015-10-09 32 views
1

如何在操作數之前使用Lambda表達式將1-9中的所有數字連接在一起?使用lambda表達式來過濾字符串

,如果我有一個像

Str = "21 2 4 + 21 1" 

一個字符串,並希望它formatet到:

newStr = "2124" 

回答

2

爲什麼不能用正則表達式?

import re 
s = "21 2 4 + 21 1" 
new_s = re.match(r'([\d ]+)[-+/*]', s).group(1).replace(' ', '') 

還是用字符串方法?

s = "21 2 4 + 21 1" 
new_s = s.split('+')[0].replace(' ', '') 
+0

這看起來超級你能告訴我在正則表達式的R」是指 – meaz0r

+1

的正則表達式是可怕的如果沒有+號。?。這個字符串會拋出一個異常,你應該在嘗試獲取該組之前檢查匹配。 –

+0

@IlianIliev - 關於運算符的一個好點;固定的。我只是簡單地鏈接了方法 - 一個快速的方法來顯示一個成功的're .match'返回一個帶有'group'方法的對象,它返回一個字符串。對於字符串方法版本,一個簡單的'for opr in'+ - * /':'將處理其他運營商。 – TigerhawkT3

0

最簡單的答案是,只是空字符串替換所有空格:

"21 2 4 + 21 1".replace(' ', '') # DO NOT DO THIS 

雖然實際的好答案是檢查你如何獲取數據以及是否可以前對其進行處理。此外,這看起來非常不安全,並可能導致大量的錯誤。

0

只是因爲你問一個拉姆達過濾:

>>> import re 
>>> s = "21 2 4 + 21 1" 
>>> ''.join(filter(lambda c: c in '123456789', re.split('[+-/*]', s)[0])) 
2124 
0

只是把這個在這裏有兩個原因:

  1. 接受的答案不使用拉姆達像OP要求
  2. OP請求在操作數上分開(在示例中使用+)

這基本上是t他同樣的方法,但考慮到額外的操作數[+, - ,*,/],使用拉姆達,如果操作不字符串中存在,不會失敗:

import re 
s = ["12 3 65 + 42", "1 8 89 0 - 192", "145 7 82 * 2"] 
map(lambda x: re.split("[\+\-\*\/]", x)[0].replace(" ", ""), s) 

將輸出

['12365', '18890', '145782'] 
+0

'lambda'在你的例子中有點設計:)而且我不相信你需要在'[]' – AChampion

+0

中轉義特殊字符OK,這是真的,我試圖做一個更好的使用lambda的例子,也當我使用'x'時,我在lambda中使用's'的方式修復了一個錯字。我也這麼認爲(關於在'[]'中轉義特殊字符),但是當我不知道時,我得到了'錯誤:錯誤的字符範圍'。 – iLoveTux

0

一種可能的方法是使用itertools.takewhile(),因爲它完全字面表達您的意圖:「所有數字從1-9一起在操作數之前?

from itertools import takewhile 
# extract all characters until the first operator 
def snip(x): 
    return takewhile(lambda x: x not in "+-*/", x) 

# extract just the digits from the snipped string and 
# make a string out of the characters 
# **EDIT** filter expression changed to let _only_ digits 
#   1-9 pass ... 
def digits(x): 
    return ''.join(filter(lambda c: ord('1')<=ord(c)<=ord('9'), snip(x))) 

證明布丁:

>>> print digits(" 1 22 hello + 3") 
122 
+0

我會謹慎地說「最正確的」,因爲這是一個意見問題。順便說一句,OP從數字列表中排除了'0'。 – AChampion

+0

同意。當涉及到... OP沒有_exactly_指定什麼是有效的輸入,什麼不是。如果在操作員之前找到非空白的非數字字符該怎麼辦? – haavee

+0

@AChampion:具體來說,如果在操作員之前找到一個數字「0」,代碼應該做些什麼**?我調整了過濾器的表達式,只提取數字1-9 – haavee

相關問題