我试图找到一个使用Python的CSS文件中的图像文件重新找到所有。以下工作除了它只发现CSS文件中的第一个图像并忽略其余部分。我如何使它抓住所有图像链接?Python findall()RE
img_links_in_css = re.findall('^ (URL |网址|网址|网址|网址)\ S(\ S *(+(PNG |。JPG | GIF | JPEG | SVG))\ S *)。*?$',str(css))
我试图找到一个使用Python的CSS文件中的图像文件重新找到所有。以下工作除了它只发现CSS文件中的第一个图像并忽略其余部分。我如何使它抓住所有图像链接?Python findall()RE
img_links_in_css = re.findall('^ (URL |网址|网址|网址|网址)\ S(\ S *(+(PNG |。JPG | GIF | JPEG | SVG))\ S *)。*?$',str(css))
有你的表达一些问题:
.+
和.*
令牌(至极的greedy quantifiers),使正则表达式匹配的第一次出现,然后捕获字符串(尤其是如果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工作,你必须消除.+
和.*
标记为好。甲simplier表达式可以用于此:
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']
在您的正则表达式中^
匹配新行(或整个文件)的开始并且$
匹配结束。因此,您的正则表达式匹配整个文件(因为末尾的.*
),并且只有一个(非重叠)匹配。
相反,你应该搜索以下:
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>
访问,如果你需要处理它们)。