Python findall()RE

时间:2017-02-11 20:23:56

标签: python-3.x findall

我正在尝试使用Python查找所有的css文件中的图像文件。以下工作除了它只找到CSS文件中的第一个图像并忽略其余图像。如何使其抓取所有图像链接?

img_links_in_css = re.findall('^。(url | URL | url | uRL | uRl)\ s (\ s *(。+。(png | jpg | gif | jpeg | svg ))\ s *)。*?$',str(css))

2 个答案:

答案 0 :(得分: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>访问这些捕获组)。

答案 1 :(得分:0)

你的表达中有一些问题:

  • .+.*令牌(greedy quantifiers)使RegEx匹配第一次出现,然后捕获字符串的所有剩余字符(特别是如果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,您还必须删除.+.*令牌。可以使用更简单的表达式:

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

其中:

  • url\*:匹配由re.I标志修改的字母U,R和L的任意组合,以忽略大小写。 ([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']