在處理this answer的過程中,我偶然發現了一個Python重複正則表達式的異常。錨定到上次匹配結束
說我給予CSV字符串引述和無引號元素的任意數量:
21,如圖2所示,'23 .5R25 ETADT」, '描述,用逗號'
我想用'\t'
替換所有','
s以外的引號。所以我想的輸出:
21 \ T2 \ t'23.5R25 ETADT '\ t'description,請用逗號'
由於將字符串中的多個匹配自然我將使用g
正則表達式修飾符。我會用引號將匹配以外的字符正則表達式或引用字符串後面是','
:
('[^']*'|[^',]*),\s*
我會替換爲:
\1\t
現在的問題是正則表達式是搜索不是匹配所以它可以選擇跳過字符,直到它可以匹配。因此,而不是我想要的輸出我得到:
21 \ T2 \ t'23.5R25 ETADT '\ t'description \ twith逗號'
你可以在這裏看到此行爲的活生生的例子:https://regex101.com/r/sG9hT3/2
問:有沒有辦法將g
修改過的正則表達式與上一次匹配後的字符開始匹配?
對於熟悉Perl的強大正則表達式的人,Perl提供了\G
。這使我們能夠檢索匹配的最後一個位置的末尾。所以,在Perl中,我可以完成我要求與正則表達式:
\G('[^']*'|[^',]*),\s*
這會迫使最終報告元素中的不匹配。因爲而不是讓正則表達式的實現找到一個點,正則表達式匹配\G
將迫使它開始在的第一字符匹配:
「的描述,用逗號」
看看[',?\ s *('[^'] *'| [^',] *)'](https://regex101.com/r/bE2aG1/1)。或者更像demo [',?[] *('[^'\ n] *'| [^',\ n] *)'](https://regex101.com/r/bE2aG1/2) 。 –
@stribizhev是的這些都是可以做到的可能的解決方法。如果這就是我所能做到的,那我就很好。但我想要回答的是我們是否可以錨定這個搜索或強制匹配,而不僅僅是搜索。 –
嗯,我想我明白了,如果您有任何疑問,請在我的回答下面留言。 –