Python正则表达式仅在使用DOTALL

时间:2017-05-18 15:13:28

标签: html regex python-2.7

我正在尝试返回一堆图片网址,并希望在我的findall函数中包含每个字符,例如新行。然而,当我使用DOTALL标志并在我的正则表达式中使用。*时,我会从有足够的结果,到只有一个。如果在正则表达式代码中使用。*的任何内容应该提供更多结果而不是更少,因为我说'我将允许零或更多的任何字符在这里'。

以下代码没有。* 它可以在IDLE或其他Python编辑器中运行,它将返回一堆图像URL。

from urllib import urlopen
from re import findall
import re

dennisov_url = 'https://denissov.ru/en/'
dennisov_html = urlopen(dennisov_url).read()

watch_image_urls = findall('<img src="([^"]*)', dennisov_html, flags=re.DOTALL)
print watch_image_urls

下面的代码是&#39;图像&#39;之间的。*。这个词应该没有实际效果,但这次只返回一个URL。

from urllib import urlopen
from re import findall
import re

dennisov_url = 'https://denissov.ru/en/'
dennisov_html = urlopen(dennisov_url).read()

watch_image_urls = findall('<img.* src="([^"]*)', dennisov_html, flags=re.DOTALL)
print watch_image_urls

有人可以告诉我为什么会这样做以及我如何修复它?

编辑:上面只是一个示例代码,我更简单地解释了我的情况。下面的代码是我的实际代码以及详细说明我希望它做什么的评论。如果您打开主URL并检查代码,您将看到之间有许多图像

from urllib import urlopen
from re import findall
import re

dennisov_url = 'https://denissov.ru/en/'
dennisov_html = urlopen(dennisov_url).read()

# Print all images between div class="grid" and div class="orderplacebut"
# Because the regex spans over several lines, use DOTALL flag to include
# every character between, including new lines
watch_image_urls = findall('<div class="grid"*?<img src="([^"]*)*?<div class="orderplacebut"', dennisov_html, flags=re.DOTALL)
print watch_image_urls
编辑:这是我从教授那里得到的回应。 &#34;除此之外,您尝试匹配图片网址所使用的策略无法成功,因为&#34;网格&#34; div类只出现在网页上一次(至少当我在Firefox中查看时)你似乎试图(a)匹配该类的开头,然后(b)获取其中出现的所有图像。这是一个非常难(我怀疑不可能!)与单个正则表达式有关的事情,因为你已经&#34;锚定&#34;类的开头的模式,阻止您单独匹配其中的每个数字。因为上面的模式的开始只在网页中出现一次,所以只能返回一个模式! (问题与&#34;贪婪&#34;匹配无关。)相反,您希望仅匹配图形URL和尽可能少的周围HTML。例如,很容易获得以&#34; .jpg&#34;结尾的所有模式。

正如您所看到的,这个问题不是关于贪婪与非贪婪的正则表达式,而是与标记的重复问题不同。

0 个答案:

没有答案