2012-02-29 6 views
1

Я пытаюсь соответствовать (с использованием регулярных выражений в Python):питон регулярное выражение re.compile матч

http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg 

в следующей строке:

http://www.mymaterialssite.com','http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg','Model Photo' 

Мой код имеет что-то вроде этого:

temp="http://www.mymaterialssite.com','http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg','Model Photo'" 
dummy=str(re.compile(r'.com'',,''(.*?)'',,''Model Photo').search(str(temp)).group(1)) 

Я не думаю, что «манекен» верен & Я не уверен, как я «убегаю» одинарной и двойной кавычки в re Команда gex re.compile.

Я пробовал поиск по сайту, но я не мог найти что-либо релевантное.

Буду признателен за любые рекомендации по этому вопросу.

Спасибо.

+0

вы уверены, что не хотите использовать 'результат = input_string.split («„“») [ 1] '? – Aprillion

ответ

7

Самый простой способ справиться со строками в Python, содержащих escape-символы и кавычки, состоит в том, чтобы утроить двойную кавычку строку (""") и префикс ее r. Например:

my_str = r"""This string would "really "suck"" to write if I didn't 
know how to tell Python to parse it as "raw" text with the 'r' character and 
triple " quotes. Especially since I want \n to show up as a backlash followed 
by n. I don't want \0 to be the null byte either!""" 

r означает "принимать управляющие символы как буквальный". Тройные двойные кавычки (""") предотвращают одинарные кавычки, двойные кавычки и двойные кавычки от преждевременного окончания строки.

EDIT: Я расширил пример, включив в него такие вещи, как \0 и \n. В обычной строке (а не в исходной строке) \ (escape-символ) означает, что следующий символ имеет особое значение. Например, \n означает «символ новой строки». Если вам буквально нужен символ \, за которым следует n в вашей строке, вам нужно будет написать \\n или просто использовать необработанную строку, как показано в приведенном выше примере.

Вы также можете прочитать о строковых литералов в документации Python здесь:

+0

Спасибо серии 8217. Это было прекрасно. Не могли бы вы объяснить, что вы подразумеваете под символом «взять escape-символы как литерал»? Я этого не понимаю. Что вы подразумеваете под эгидой? – AJW

+0

@James, я расширил строку примера, чтобы включить такие вещи, как '\ 0' и' \ n'. Я также описал, что это такое. –

+0

Еще раз спасибо Series8217 за разъяснения. Это действительно помогает (dmn docs иногда путают!). Принял ваш ответ. – AJW

0

Попробуйте тройные кавычки:

import re 
tmp=""".*http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg.*""" 
str="""http://www.mymaterialssite.com\'\,\'http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg','Model Photo'""" 
x=re.match(tmp,str) 
if x!=None: 
    print x.group() 

Также отсутствовали * в начале рисунка и в конце.. Я добавил это тоже.

0

Запятые не должны быть экранированы, и одиночные кавычки не должны быть экранированы, если вы используете двойные кавычки, чтобы создать строку:

>>> dummy=re.compile(r".com','(.*?)','Model Photo").search(temp).group(1) 
>>> print dummy 
http://images.mymaterials.com/images/steel-images/small/steel/steel800/steel800-2.jpg 

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

'.com\',\'(.*?)\',\'Model Photo' 

Как mykhal отметил в комментарии, это не работает очень красиво с регулярным выражением, потому что вы не можете l onger использовать необработанную строку (r'...') буквальный. Лучшим решением было бы использовать тройные кавычки в качестве других предложенных ответов.

+0

Остерегайтесь, зазоры действительно обратные в строке 'r '...''! :) – mykhal

+0

@mykhal - Хорошая точка! Отредактировал свой ответ, чтобы отразить это. –

0

, если вы используете двойные кавычки (которые имеют тот же что означает одиночные, в Python), вам вообще не нужно бежать ... (в данном случае). Вы можете даже использовать строковый литерал без запуска r (у вас нет какой-либо обратной косой черты там)

re.compile(".com','(.*?)','Model Photo")