2017-09-16 85 views
0

假設我有一個逗號分隔行:正則表達式:逗號分隔的複雜羣體

aa,bb,cc 

我可以使用正則表達式這個(沒有真正確定,因爲這也符合,aa但在這裏不是問題):

(<my pattern>)?(,<my pattern>)* 

例如

([a-zA-Z]*)?(,[a-zA-Z]*)* 

現在,假設<my pattern>很長且複雜,這將是很好,如果我可以這樣說:

(<my pattern>)?(,<repeat previous/named group>)* 

有沒有辦法說重複某一組(名稱)(在Python 3.5中)

+0

'很長,complex'而, 所以呢?只需通過'(?:[a-zA-Z] +)(?:,?[a-zA-Z])複製它即可。''因爲'<你的模式>'沒什麼特別的,所以沒有理由使用遞歸。只有在需要平衡文本(可以是任何東西)時才使用遞歸,因爲一般的遞歸會增加相當大的開銷。 – sln

回答

0

恐怕這樣的語法糖在正則表達式中不存在,但考慮到python使用正則表達式的字符串,您可以簡單地使用字符串格式來減少代碼:

re.findall('({0})?(,{0})*'.format(<your_pattern>), <some_string>) 
+0

這樣的語法糖存在但不在Python re模塊中。但是,它存在於正則表達式模塊中:https://pypi.python.org/pypi/regex。請注意,該模塊還支持重複捕獲。藉助此功能,您可以同時提取和檢查。 –

+0

它不是一個「語法糖」,因爲這個特性使得遞歸成爲可能,並且允許像詞法分析器那樣編寫一個模式。 –

0

有支持這種反向引用的正則表達式引擎,但Python的正則表達式引擎不支持。

但是,僅僅因爲正則表達式引擎沒有內建支持,並不意味着我們不能建立一個實現我們目標的正則表達式模式。我們所要做的就是改變,在正則表達式 - 而不是尋找一個逗號,我們要允許一個逗號字符串的開頭:

((?:,|^)[a-zA-Z]*)* 
相關問題