2

我有一个字符串

<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />

在 Python 中找到 ABCDXYZ 的正则表达式是什么

4

3 回答 3

5

不要使用正则表达式来解析 HTML。使用BeautifulSoup

from bs4 import BeautifulSoup as BS
text = '''<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />'''
soup = BS(text)
print soup.find('img').attrs['alt']
于 2013-01-07T05:12:54.563 回答
2

如果您正在寻找该alt属性的值,您可以这样做:

>>> r = r'alt="(.*?)"'

然后:

>>> m = re.search(r, mystring)
>>> m.group(1)
'ABCDXYZ'

re.findall如果你想找到不止一个,你可以使用。

但是,这段代码很容易被这样的东西愚弄:

<span>Here's some text explaining how to do alt="foo" in an img tag.</span>

另一方面,它也无法拾取这样的东西:

<img src='/p_img/411/123411/639469aa9f_123411_100.jpg' alt='ABCDXYZ' />

你怎么处理?简短的回答是:你没有。XML 和 HTML 不是常规语言。

值得在这里指出的是,Python 的 re 引擎实际上并不是一个真正的正则表达式引擎——而且,最重要的是,它嵌入在图灵完备的编程语言中。所以显然可以围绕 Python 和re. 这个答案显示了用 编写的解析器的一部分perl,其中正则表达式完成了大部分繁重的工作。但这并不意味着你应该这样做。你不应该首先编写解析器,因为已经存在完美的解析器,如果你这样做了,即使有更简单的方法来做你想做的事,你也不应该强迫自己使用正则表达式。对于快速和肮脏的游戏,正则表达式很好。对于生产程序,它'

说服你的老板让你使用解析器的一种方法是设计一套测试,这些测试显然都是有效的,而且如果没有完整的解析器,任何基于正则表达式的解决方案都无法处理这些测试。如果你能想出一个可以解析的测试,但只使用指数回溯,因此使用正则表达式需要 12 小时,而使用 bs4 需要 0.1 秒,那就更好了,但这有点棘手......</p>

当然,也值得在网上寻找文章(以及诸如此类的问题以及其他300个重复的问题)并挑选最好的文章展示给您的老板。

如果你真的无法说服你的老板,那么你就完成了。鉴于指定的内容,这是可行的。考虑到可能或可能不是真正的意图,只有读心术是行不通的。当您发现越来越多的实际案例失败时,您可以通过在正则表达式本身上添加越来越复杂的交替和/或上下文来破解它,或者可能使用一系列正则表达式和后过滤器,直到最后你得到厌倦了它,并为自己找到一份更好的工作。

于 2013-01-07T05:12:33.750 回答
0

首先,免责声明:您不应该使用正则表达式来解析HTML。您可以为此使用 BeautifulSoup

接下来,如果您真的很想使用正则表达式并且上面是您想要的确切情况,那么您可以执行以下操作:

<a href="[a-zA-Z0-9/]+"><img src="[a-zA-Z0-9/]+" alt="([a-zA-Z0-9/]+)" />

您可以通过匹配对象的组属性访问文本。

于 2013-01-07T05:16:51.510 回答