2012-01-14 3 views
0

У меня есть шаблон: «\ nvariable СЛОВО»Regex соответствие новой строки перед тем словом в Python

Эта модель показывает вверх много раз в строке, и я хочу список индексов, эта модель показывает вверх на. «WORD» фиксирован и не изменяется от экземпляра к экземпляру, но «переменная» изменяется по содержанию и длине.

В питона, я знаю, что это соответствует всем СЛОВО и возвращает их индексы в списке:

contents="some long string" 
print [m.start() for m in re.finditer('WORD',contents)] 

Так короче, Как найти индексы всех «переменной» после того, как \ п, но до «WORD «?

+0

Какие символы составляют 'переменная'? Дайте некоторые _real_ примеры строк, которые вы хотите найти. – ekhumoro

+0

не только это, дайте нам пример с барахлом, который будет arround ваш neddle в стоге сена –

ответ

2

Если единственным инструментом, который вы знаете, является молоток, каждая проблема выглядит как гвоздь.

Регулярные выражения - это мощные молоты, но иногда это не лучший инструмент для выполнения задачи. На самом деле, регулярные выражения сильно злоупотребляют, я чувствую, как дрожит по позвоночнику каждый раз, когда кто-то просит меня проверить сложные регулярные выражения от другого программиста (часто я не могу понять мой через несколько недель).

С другой стороны, нотация EBNF (Extended Backus-Naur Form) намного легче понять и поддерживать.

from simpleparse.parser import Parser 

grammar = r""" 
<space>  := [ \t] 
<newline> := '\n' 
<identifier> := [A-Za-z_],[A-Za-z0-9z_]* 
match  := newline,identifier,space+,'WORD' 
<junk>  := newline*,identifier,space+,-'WORD',(identifier/space)* 
data   := (match/junk)* 
""" 

parser = Parser(grammar, 'data') 

data = 'some junk\nvariable1 WORD\nvariable2 some ' +\ 
     'junk\nvariable3 WORD\nvariable4 some other ' +\ 
     'junk\nvariable5 WORD' 

(start, matches, stop) = parser.parse(data) 

print [ start for name, start, stop, other in matches ] 

Это будет печатать:

[9, 44, 85] 
+0

Моя ситуация оказалась другой, но, учитывая это, я думаю, что это лучший ответ на вопрос, который я опубликовал. Благодаря! – Oliver

2

Будет ли это суфией?

>>> import re 
>>> s = '\nvariable1 WORD\nvariable2 WORD\nvariable3 WORD\nvariable4 WORD\nvariable5 WORD' 
>>> re.findall(r'\n(\w+)\s+WORD', s) 
['variable1', 'variable2', 'variable3', 'variable4', 'variable5'] 

Для чего нужны индексы?

0

Возможно, вам придется компенсировать индексы от стартовых точек в зависимости от вашей цели. Если в '\ n' вы ожидаете новые строки, тогда вам придется включить флаг MULTILINE в компиляцию.

import re 

mytext='\nvar1 WORD\nvar2 WORD\nvar3 WORD' 
#compile a pattern to find the 'var*' after \n 
pat = re.compile('\n(.*?)\s+WORD') 

results = re.finditer(pat,mytext) 

for result in results: 
    print result.start() 
0

Ах, ну, оказалось, что текст на самом деле содержится Ctrl-M возвращаемые символы вместо перевода строки символов, которые сводили меня с ума. Я удалил те, и я только что использовал:

[m.start() for m in re.finditer('\w+\sWORD',contents)] 

Спасибо за помощь! Разумеется, Simpleparser тоже работает.

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