2017-02-11 2 views
0

Я пытаюсь найти файлы изображений в файле css, используя Python re find all. Следующие работы за исключением того, что он находит только первое изображение в файле CSS и игнорирует остальные. Как я могу захватить все ссылки на изображения?Python findall() RE

img_links_in_css = re.findall ('^ (URL |. URL | Url | Url | URL) \ S (\ S * (+ (PNG |.. JPG | GIF | JPEG | SVG)) \ s *). *? $ ', str (css))

ответ

0

Есть некоторые проблемы в вашем выражении:

  • В .+ и .* жетоны (которым являются greedy quantifiers) делает RegEx соответствовать первое вхождение, а затем захватить все остальные символы строки (особенно если CSS является Минимизированный); и
  • Жетоны ^ и $ только если CSS не уменьшенная (все в одной строке), и если вы используете многострочный флаг (re.M или re.MULTILINE);

Таким образом, вы можете изменить его (для не-уменьшенной CSS):

 
    pattern = r'^.+(?:uRl|URL|Url|uRL|Uri)\s?(\s*(?:.+.(?:png|jpg|gif|jpeg|svg))\s*).*?$' 
    re.findall(pattern, str(css), re.M) 

Для работы с уменьшенной CSS вы должны устранить .+ и .* жетонов, а также. Выражение может быть проще использовать для этого:

pattern = r'url\s*\(([^)]+)' 
re.findall(pattern, str(css), re.I) 

Где:

  • url\*: соответствует любой комбинации букв U, R и L, модифицированных с помощью флага re.I игнорировать случаи. (Вместо этого можно использовать [Uu][Rr][Ll]);
  • \s*: предшествующие или отсутствующие пробелами;
  • \(: открытые круглые скобки;
  • И финналы, группа ([^)]+) соответствие любому персонажу, отличному от ).

Пример:

 
    >>> css = 'body{background-attachment:fixed;background-image:uRl(./Images/bg4.png)}.img-default{background-image:Url(./images/def.jpg)}div#header{\nbackground-image:url(images/header-background.jpg)\n}' 
    >>> re.findall(r'url\(([^)]+)', css, re.I) 
    ['./Images/bg4.png', './images/def.jpg', 'images/header-background.jpg'] 
0

в вашем regex ^ соответствует началу новой строки (или всего файла) и $ соответствует концу. Поэтому ваше регулярное выражение соответствует всему файлу (из-за .* в конце), и у вас есть только одно (неперекрывающееся) совпадение.

Вместо этого вы должны искать следующее:

r'(url|URL|Url|uRL|uRl)\s(\s*(.+?\.(png|jpg|gif|jpeg|svg))\s*)' 

Изменения

  • удаления ^.* и .*$ в начале и в конце.
  • .+? вместо .+ для создания ИНТ, не неоднозначны (соответствие наименьшую строку)
  • на поиск актуальной «» должно быть сделано с \. или [.]
  • Обратите внимание, что \s* не является необходимым, и что \s\s* можно заменить \s+, если это не вопрос захвата групп.

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

Может быть, как это (в зависимости от которой части вы хотите):

r'(?:url|URL|Url|uRL|uRl)\s\s*.+?\.(?:png|jpg|gif|jpeg|svg)' 

или

r'(?:url|URL|Url|uRL|uRl)\s\s*(.+?)\.(?:png|jpg|gif|jpeg|svg)' 

для захвата только часть внутри (в Python эти захватывая-группы доступны с \g<1> если вы необходимо их обработать).