2010-10-23 5 views
0

Я ищу файл строки за строкой для появления ## random_string ##. Он работает при многократном # кроме ...Python Регулярное выражение Соответствие: ## ##

pattern='##(.*?)##' 
prog=re.compile(pattern) 

string='lala ###hey## there' 
result=prog.search(string) 

print re.sub(result.group(1), 'FOUND', string) 

Желаемая Выход:

"lala #FOUND there" 

Вместо этого я получаю следующее, потому что его захватывая все ### эй ##:

"lala FOUND there" 

Так как бы я проигнорировал любое число # в начале или конце и только захватил «## string ##».

+0

будьте осторожны с использованием ленивых кванторов, таких как '(. *?)', Потому что он будет соответствовать '## abC#####' и захватить 'abC###'.также ленивые кванторы очень медленны. – glebm

ответ

3

Чтобы соответствовать по крайней мере двух хешей на обоих концах:

pattern='##+(.*?)##+' 
+0

им извините, но я изложить мой вопрос плохой. Я хочу соответствовать ТОЧНО ## ## и игнорировать другой ### в начале или в конце (im вызывает re.sub, и он будет конфликтовать с моими результатами). – nubme

+0

@nubme: Я не уверен, что вы имеете в виду. Это именно то, что мой ответ. Я просто протестировал его и подтвердил, что он выводит 'hey' и будет соответствовать только если строка имеет по крайней мере два символа' # 'на каждом конце. –

+0

@marcelo: извините, я отредактировал мой вопрос, посмотрим, имеет ли он теперь больше смысла. – nubme

1

'^#{2,}([^#]*)#{2,}' - любое число #> = 2 на обоих концах

быть осторожным с использованием ленивых кванторов, как потому, что бы соответствовать '## а #####' и захват (*.?) 'а ###'. также ленивые кванторы очень медленно

+0

Я думаю, что он хочет хотя бы 2 в начале * и * в конце. –

+0

редактирование, спасибо – glebm

0

попробовать «блок комментарий трюк»: /##((?:[^#]|#[^#])+?)##/ Screenshot of working example

0

Добавление + в регулярное выражение, которое означает соответствуют одному или нескольким символам.

pattern='#+(.*?)#+' 
prog=re.compile(pattern) 

string='###HEY##' 
result=prog.search(string) 
print result.group(1) 

Выход:

HEY 
0

вы рассмотрели делать это без регулярных выражений путь?

>>> string='lala ####hey## there' 
>>> string.split("####")[1].split("#")[0] 
'hey' 
3

Ваша проблема с вашим внутренним соответствием. Вы используете ., который соответствует любому символу, который не является концом строки, а это значит, что он соответствует #. Поэтому, когда он получает ###hey##, он соответствует (.*?) - #hey.

Простое решение исключить # символ из Matchable набора:

prog = re.compile(r'##([^#]*)##') 

Protip: Используйте сырые строки (например r'') для регулярных выражений, так что вы не должны сходить с ума обратный слеш.

Попытка разрешить # внутри хэшей сделает вещи много более сложным.

EDIT: Если вы не хотите, чтобы пустой внутренний текст (т.е. «####» не должен совпадать с внутренним текстом «»), а затем изменить его на:

prog = re.compile(r'##([^#]+)##') 

+ означает «один или несколько».

0
>>> import re 
>>> text= 'lala ###hey## there' 
>>> matcher= re.compile(r"##[^#]+##") 
>>> print matcher.sub("FOUND", text) 
lala #FOUND there 
>>> 
Смежные вопросы