2013-02-06 87 views
1

我想做一個正則表達式,它會發現某些錯誤輸入分數的情況,並將分子和分母作爲組返回。邏輯或組正則表達式

這些情況涉及斜槓和數字之間的空格:例如或1/ 2

我使用的是邏輯或操作員在正則表達式,因爲我寧願沒有2種獨立的模式,以檢查:

r'(\d) /(\d)|(\d)/ (\d)' 

(我不使用\d+

因爲我更感興趣的是與分部標誌直接相鄰的數字,儘管 \d+也可以)。

的問題是,當它匹配的情形之一的,說第二(1/ 2),看着所有的羣體給予(None, None, '1', '2'),但我想有一個正則表達式,只有返回2組 - 在這兩種情況下,我希望這些小組成爲('1','2')。這可能嗎?

編輯: 我也想它返回組(「1」,「2」)的情況下1/2,但不能捕捉像1/2合式分東西。

+0

什麼是'1/2'和'1/2'需要的輸出? –

+0

好點,更新的問題。 – beardc

回答

3

(\d)(?: /|/ | /)(\d)應該這樣做(並只返回不正確輸入的分數)。注意使用no-capture組。

編輯:更新了下面的評論。

+0

第一個非捕獲組是做什麼的?只需讓'|'爲兩個非捕獲工作? – beardc

+0

我更新了這個問題以迴應Naveed的評論,但我認爲這是我將要去的方式(但是爲'1/2'添加'',例如'(\ d)(?:(?: /)|( ?:/)|(?: /))(\ d)')。如果你可以更新它,我會接受。 – beardc

+0

至少擺脫內部羣體:'(\ d)(?:/|/| /)(\ d)'。 –

3

剛剛使用(\d)\s*/\s*(\d)怎麼辦?

這樣,你將始終只有兩類:

>>> import re 
>>> regex = r'(\d)\s*/\s*(\d)' 
>>> re.findall(regex, '1/2') 
[('1', '2')] 
>>> re.findall(regex, '1 /2') 
[('1', '2')] 
>>> re.findall(regex, '1/ 2') 
[('1', '2')] 
>>> re.findall(regex, '1/2') 
[('1', '2')] 
>>> 
+0

由於一般性,我喜歡這個。不幸的是,當進行替換時,它的速度是其他答案的兩倍,這不會成爲問題,但是我所做的所有正則表達式都已經開始累積在我的應用程序中了。 – beardc