我正在尝试使用Python查找所有的css文件中的图像文件。以下工作除了它只找到CSS文件中的第一个图像并忽略其余图像。如何使其抓取所有图像链接?
img_links_in_css = re.findall('^。(url | URL | url | uRL | uRl)\ s (\ s *(。+。(png | jpg | gif | jpeg | svg ))\ s *)。*?$',str(css))
答案 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.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\*
:匹配由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']