我有一個工作正則表達式給了我想要的結果,但它並沒有包含它所需要的安全性。 (防呆)Python正則表達式在模式內出現零次或多次出現
比方說,我有一個匹配的路線的部分地區,東西線沿線的一個正則表達式:我希望能夠更換匹配任何字符了,直到
import re
path = "C:/Projects/foo/dev/model/props/furniture/couch/data/fbx"
regex = re.compile("(.+)/dev/model/(.+)/(.+)/data/fbx")
m = regex.search(path)
if m:
print m.groups()
# ('C:/Projects/foo', 'props/furniture', 'couch')
跟隨正則表達式的一部分,其中某些匹配一個或多個文件夾。
比方說,我們定義了一個文件夾以斜線結束簡單的單詞字符(沒有或更多)這將是:
[\w]*/
我想組零到那些十,我會怎麼做那?
在我心目中,我有這樣的事情(注意,這不工作!):
# match any number of word characters ending with a slash zero to ten times
([[\w]*/]{0,10})
# match any number of word characters ending with a slash zero to one time
([[\w]*/]?)
編輯:
基於RedBaron和jamylak的答案,我想出了以下內容:
((?:[:\w]+/){0,3})
這將組0到3個以斜槓'/'結尾的字符[:\ w]。使用?:在組的開頭不會被髮送回匹配的分組。所以,結合他們的外部團體是。因此我們只得到完全分組的結果。
唯一的問題是,我希望最後一部分也可能匹配一個文件。 (所以不要以斜槓結尾。)我甚至更喜歡將它從正則表達式中刪除,但我也可以輕鬆地刪除結果的結尾。
任何反饋,非常感謝。如果這是要走的路,我會將其添加爲答案。
編輯:
它涉及到:Finding folders back based on a predefined folder structure
UPDATE /編輯:
基於迄今爲止給出的所有答案,我想出了各種各樣的嘗試,但他們最終所有結果都極其緩慢。
import re
path = "C:/Projects/foo/dev/model/props/furniture/couch/data/fbx"
regex = re.compile(r"""((?:^(?:[\w:]+/?)+)|(?:(?<=/)(?:[\w]+/?)+))/dev/model/""")
print 'search start'
m = regex.search(path)
print 'search done'
if m:
print 'match', m, m.groups()
else:
print 'no match'
我並不完全知道如何加快速度!
請顯示「路徑」示例的所需輸出。 – 2013-03-21 10:31:49
從我的問題的頂部示例代碼給出的輸出是所需的輸出。但是我想爲比賽添加更多的功能,所以我可以更精確地定義它。例如,只匹配兩到四個文件夾。 – 2013-03-21 10:55:48