2015-12-21 82 views
3

在我的代碼中,我從子表達式列表中生成正則表達式。加入表情,如果我把他們每個人在非匹配組(?:…)正常工作:無法匹配的正則表達式(對於生成的表達式)

# concatenation: 
joined_expr = ''.join('(?:{})'.format(expr) for expr in subexpression) 
# disjunction: 
joined_expr = '|'.join('(?:{})'.format(expr) for expr in subexpression) 

問題是:這樣做的結果是加盟的表達是一個更大的表達式一個子表達式,並subexpression可能是空的,但連接的表達式不能與空字符串匹配。

那麼爲什麼要讓成爲一個正則表達式,這與不符? (?:(?!.).)會工作嗎?如果不是,爲什麼不呢? Python的re引擎是否理解我嘗試創建失敗的分支並對其進行優化?

+1

有,如果它被標記爲一個非捕獲組是問題,如果一個空字符串相匹配? –

+0

'joined_expr'將用於連接的表達式,這是一個析取的分支。該分支不能匹配(即必須失敗)。我在這裏使用「匹配」一詞作爲「不會失敗」。 – kay

+0

如果您正在尋找不對結果字符串進行操作(如果它爲空),爲什麼不直接跳過re並執行match = regex.match(string);如果匹配和布爾(字符串):do_code' 它的方式更簡單,可能比通過組合條件檢查空字符串更快。 –

回答

4

備用使用正則表達式引擎所經過的時間:

\Zx # or '$s' to match a literal after the end of the string 

它更簡單,比(?:(?!.).)的長字符串,你獲得相同的結果。

這裏是的4231字符文本短在線測試:

+0

哇,謝謝! '\ Zx'正是我期待的! – kay

0

一個CAN在理解否定前瞻斷言的引擎中使用(?!)。 PCRE使用(*FAIL)作爲更可讀的同義詞。

如果要強制匹配失敗在一個模式的某個時刻,最便捷的方式來做到這一點是與(?!)因爲一個空字符串總是匹配,這樣就要求有沒有斷言是一個空字符串必須總是失敗。回溯控制動詞(*FAIL)(*F)(?!)的同義詞。

- http://www.pcre.org/current/doc/html/pcre2pattern.html