簡體   English   中英

正則表達式實現細節

[英]Regular expression implementation details

我回答的一個問題讓我想知道:

如何在Python中實現正則表達式? 那里有什么樣的效率保證? 實施是“標准”,還是可以改變?

我認為正則表達式將作為DFA實現,因此非常有效(最多需要對輸入字符串進行一次掃描)。 Laurence Gonsalves提出了一個有趣的觀點,即並非所有Python正則表達式都是常規的。 (他的例子是r“(a +)b \\ 1”,它匹配a的一些數量,ab,然后是與之前相同數量的a)。 使用DFA顯然無法實現這一點。

那么,重申一下:Python正則表達式的實現細節和保證是什么?

如果有人可以給出某種解釋(根據實現),為什么正則表達式“cat | catdog”和“catdog | cat”會在字符串“catdog”中導致不同的搜索結果,這也很好。在我之前提到的問題中提到過

Python的re模塊基於PCRE ,但已經轉移到他們自己的實現上。

這是C代碼的鏈接。

當采用不正確的路徑時,似乎庫是基於遞歸回溯的。

替代文字

正則表達式和文本大小n
一種? n a n匹配n

請記住,此圖表不代表正常的正則表達式搜索。

http://swtch.com/~rsc/regexp/regexp1.html

Python RE上沒有任何“效率保證”,而不是語言的任何其他部分(C ++的標准庫是我所知道的唯一廣泛的語言標准,試圖建立這樣的標准 - 但是沒有標准,即使在C ++中,指定,比如說,乘以兩個整數必須花費恆定的時間,或類似的東西); 也不保證任何時候都不會應用大的優化。

今天,F。Lundh(最初負責實現Python當前的RE模塊等),在Pycon Italia上展示Unladen Swallow,他們提到他們將探索的一個途徑是將正則表達式直接編譯為LLVM中間代碼(而不是他們的由ad-hoc運行時解釋自己的字節碼風格 - 因為普通的Python代碼也被編譯到LLVM(在即將發布的Unladen Swallow版本中),RE及其周圍的Python代碼可以一起優化,甚至有時甚至以非常激進的方式 我懷疑這樣的事情很快就會接近“生產就緒”,盡管如此;-)。

將正則表達式與反向引用匹配是NP難的 ,這至少與NP-Complete一樣難。 這基本上意味着它與您可能遇到的任何問題一樣困難,並且大多數計算機科學家認為在最壞的情況下它可能需要指數時間。 如果你能在多項式時間內匹配這些“常規”表達式(在技術意義上真的不是這樣),你就可以贏得一百萬美元

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM