我試圖找到一個使用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>
訪問,如果你需要處理它們)。