2017-02-11 39 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>訪問,如果你需要處理它們)。