2014-01-10 3 views
0

Для просмотра данных я использую регулярные выражения. Один из моих регулярных выражений (они динамичны и изменяются в зависимости от того, что компьютер должен искать --- использовать их для поиска с помощью данных для игры AI):Python Regular Expressions 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, потому что у вас будет более одного соответствия (я сократил список строк, но на самом деле около 20 тысяч строк), и мне нужно найти самый короткий (так как это будет самый короткий путь для ИИ выиграть).

Есть ли способ сопоставить всю строку (или просто последние числа после тех, которые я предоставил)?

Заранее благодарен!

ответ

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) У него будет более 20 тысяч строк, что будет очень утомительным/предполагающим больше времени и ресурсов, чем использование регулярных выражений. –

Смежные вопросы