2014-01-10 173 views
0

要查看數據,我正在使用正則表達式。我的一個正則表達式的是(它們是動態的,變化的依據是什麼,計算機需要尋找---用他們通過對遊戲AI數據搜索):Python正則表達式Findall

O,2,([0-9],?){0,},X 

2,可以後(並且很可能會)是其他數字,每個數字後面跟着一個逗號。

據我瞭解,這將匹配:

O,2,(any amount of numbers - can be 0 in total, each followed by a comma),X 

這是好的,工作(在RegExr)爲:

O,4,1,8,6,7,9,5,3,X 
X,6,3,7,5,9,4,1,8,2,T 
O,2,9,6,7,11,8,X # matches this 
O,4,6,9,3,1,7,5,O 
X,6,9,3,5,1,7,4,8,O 
X,3,2,7,1,9,4,6,X 
X,9,2,6,8,5,3,1,X 

我的問題是,我需要所有的數字後匹配原來的,提供的號碼。所以,我想匹配(在這個例子中)9,6,7,11,8

然而,Python實現這一點:

import re 
pattern = re.compile("O,2,([0-9],?){0,},X") 
matches = pattern.findall(s) # s is the above string 

matches['8'],最後的數字,但我需要匹配所有的數字給定(所以'9,6,7,11,8')之後。

注意:我需要使用pattern.findall,因爲你會有多個匹配項(我縮短了我的字符串列表,但實際上有大約2萬個字符串),我需要找到最短的一個(因爲這將是AI獲勝的最短途徑)。

有沒有辦法匹配整個字符串(或只是我提供的最後一個數字)?

在此先感謝!

回答

3

使用此:

O,2,((?:[0-9],?){0,}),X 

看到它在行動:http://regex101.com/r/cV9wS1

import re 

s = '''O,4,1,8,6,7,9,5,3,X 
X,6,3,7,5,9,4,1,8,2,T 
O,2,9,6,7,11,8,X 
O,4,6,9,3,1,7,5,O 
X,6,9,3,5,1,7,4,8,O 
X,3,2,7,1,9,4,6,X 
X,9,2,6,8,5,3,1,X''' 

pattern = re.compile("O,2,((?:[0-9],?){0,}),X") 
matches = pattern.findall(s) # s is the above string 

print matches 

輸出:

['9,6,7,11,8'] 

解釋:

通過環繞整個在2,,X之間的值捕獲(),你最終也捕獲。然後我用(?:)來忽略內部捕獲的集合。

0

你沒有使用正則表達式

  1. 的字符串分割到數組
  2. 檢查項目0 == 0,第1個== 2
  3. 檢查最後一個項目== X
  4. 檢查項目[2:-2]它們中的每一個是一個數字(is_digit

這是所有

+0

1)我不知道有多少值可以存在 2)它將有超過2萬個字符串,這將是非常單調乏味的/假設比使用正則表達式更耗費時間和資源。 –

相關問題