2016-03-01 54 views
0

我有以下代碼:正則表達式使用 + =無法按預期工作/逃脫 '+'

import re 
pattern = r'.className\s*\+?=\s*.*?\+?[\'"](.*?)["\']' 
code_str = "if (El.className == 'blue') {\nEl.className = 'className20';\n}\n" 
re.findall(pattern, code_str) 

輸出>>>['blue', 'className20']

我只希望輸出['className20']

[更新] 它還需要處理,其中some_strclassName20合併此級聯情況。它應該仍然只能返回['className20']

code_str2 = "if (El.className == 'blue') {\nEl.className = some_str + 'className20';\n}\n" 
re.findall(pattern, code_str) 

我也試過了。

pattern = r'.className\s*\+{,1}={1}\s*.*?\+?[\'"](.*?)["\']' 
pattern = r'.className\s*\+?[=]{1}\s*.*?\+?[\'"](.*?)["\']' 

歡迎任何見解。問題似乎是==出現在code_str。我使用的模式太貪婪。我的理解是,\+正在轉義+符號,但我可能是錯的。

+1

可接受模式背後的邏輯是什麼?它是駱駝的情況下跟數字? – karthikr

+1

如果你想在**之後的**字符**,而不是在==之後的字**,可以使用兩個步驟:在==之後找到字,並刪除它,包括==。第二步(使用不同的正則表達式,找到** word **之後= –

回答

1

爲什麼在=\s*之後有.*??你想允許任何事情遵循平等,其次是任何空間?這就是允許== 'blue'被接受; \s*什麼都不做,但以下.*?匹配=跟在第一個=之後。將其刪除,它的工作原理:

import re 
pattern = r'.className\s*\+?=\s*\+?[\'"](.*?)["\']' 
code_str = "if (El.className == 'blue') {\nEl.className = 'className20';\n}\n" 
re.findall(pattern, code_str) 

生產['className20']預期。問題是,是否有理由允許任意角色出現。

+0

這是按照你所描述的方式工作的,但是我已經意識到在測試它時我有一個需要處理的連接案例。與第二個案件。 –