2017-02-11 51 views
0

我试图找到一个使用Python的CSS文件中的图像文件重新找到所有。以下工作除了它只发现CSS文件中的第一个图像并忽略其余部分。我如何使它抓住所有图像链接?Python findall()RE

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

回答

0

有你的表达一些问题:

  • .+.*令牌(至极的greedy quantifiers),使正则表达式匹配的第一次出现,然后捕获字符串(尤其是如果CSS是所有剩余的字符缩小的);和
  • 令牌^$将仅在CSS不精缩(全部在同一行),如果你使用多行标志(re.Mre.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工作,你必须消除.+.*标记为好。甲simplier表达式可以用于此:

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

其中:

  • url\*:字母U,R和L,由re.I标志修饰以忽略箱子的任意组合相匹配。 (可以用[Uu][Rr][Ll]代替);
  • \s*:在空格之前还是空格之外;
  • \(:开括号;
  • 和finnaly,该组([^)]+)匹配不同于)的任何字符。

实施例:

 
    >>> 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

在您的正则表达式中^匹配新行(或整个文件)的开始并且$匹配结束。因此,您的正则表达式匹配整个文件(因为末尾的.*),并且只有一个(非重叠)匹配。

相反,你应该搜索以下:

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

的变化是

  • 在开头和结尾删除^.*.*$
  • .+?而不是.+用于使int非歧义(匹配最小可能的字符串)
  • 搜索实际的“。”。应\.[.]
  • 注意,\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>访问,如果你需要处理它们)。