2011-07-13 79 views
2

,是否有可能根據找到的重複次數捕獲可變數量的捕獲塊?例如,在下面的搜索字符串中,我想用相同的正則表達式捕獲所有的數字字符串。使用python3的正則表達式功能的Python正則表達式重複與捕獲問題

搜索串1(試圖捕捉:89,45):

zzz89zzz45.mp3 

搜索字符串2(試圖捕捉:98,67,89,45):

zzz98zzz67zzz89zzz45.mp3 

搜索字符串3(試圖捕捉:98,67,89,45,55,111):

zzz98zzz67zzz89zzz45vdvd55lplp111.mp3 

以下正則表達式匹配的所有重複,雖然所有值都不可用於以後使用(僅1位串被捕獲):

((\d+)\D*)*\.mp3$ 

其他2個選項被寫入不同的正則表達式的每個的情況下,或使用的findall()。有沒有辦法調整上述正則表達式,以捕獲每一個數字字符串以供以後使用不同數量的重複使用正則表達式工具,或者在python3中執行此操作,您是否被迫使用findall()?

+0

findall有什麼問題? –

+0

findall沒什麼問題,我現在在我的代碼中使用它。我只是想更好地理解正則表達式。 –

回答

3

大多數或所有常用的正則表達式引擎,包括特別是那些基於PCRE語法(如Python的),標籤根據其捕獲組到左括號的數字索引作爲正則表達式寫入。所以不行,你不能單獨使用捕獲組來從字符串中提取任意數量的子序列。

你可以得到的最接近的(據我所知)是手動寫出一定數量的捕獲組的,是這樣的:

s = ... 
res = re.match(r'\D*' + 25 * r'(\d+)\D+') 
numbers = [r for r in res.groups() if r is not None] 

這將讓您多達25組數字。如果您需要更多,請用更高的數字替換25。

我不會感到驚訝,如果這種方法效率低於迭代方法findall(),雖然我沒有測試過它。

+0

謝謝。這正是我正在尋找的。我想,Python是Python和所有,findall()將不可用,如果我們不需要它,但我只是想確保。 –

+0

「如果我們不需要它,findall()將不可用」......嗯?無論如何,如果我自己這樣做,我幾乎肯定會使用'findall()'。 –

+0

我只是想到http://wiki.python。org/moin/TOOWTDI –

3

這點之前,所有的數字匹配:

s = "zzz98zzz67zzz89zzz45vdvd55lplp111.mp3" 
res = re.findall("[0-9]+(?=.*\\.)", s) 
print(res) 
+0

它會,但你使用findall()。我想知道你是否可以使用正則表達式,而不是使用python3提供的額外函數。 –

+0

這是使用正則表達式 - 參數findall是一個正則表達式,不是嗎? –

+0

在我的代碼中,我去掉.mp3,然後做一個findall('\ d +')。雖然'\ d +'是一個正則表達式,但我感興趣的是如果可能在python3中使用findall()這樣的「裸」正則表達式來做這件事。我對這是否是正則表達式可以處理的問題感興趣,或者在這種情況下需要諸如findall()之類的東西。 –