正则表达式找到一个字符串python

时间:2013-01-07 05:05:54

标签: python regex

我有一个字符串

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

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

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

如果您要查找该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的引擎实际上并不是真正的正则表达式引擎 - 而且,最重要的是,它嵌入了图灵完整的编程语言中。显然,可能围绕Python和re构建HTML解析器。 This answer显示了用perl编写的解析器的一部分,其中正则表达式完成了大部分繁重的工作。但这并不意味着你应该这样做。你不应该首先编写一个解析器,因为已经存在非常好的解析器,如果你这样做了,你就不应该强迫自己使用正则表达式,即使有更简单的方法来做你想做的事情。对于快速和肮脏的游戏,正则表达式很好。对于制作节目,它几乎总是错误的答案。

说服你的老板让你使用解析器的一种方法是制作一套显然有效的测试,并且除了完整的解析器之外,任何基于正则表达式的解决方案都无法处理。如果你可以提出一个可以解析的测试,但只能使用指数回溯,因此使用正则表达式需要12小时而使用bs4需要0.1秒,甚至更好,但这有点棘手......

当然,也值得在线寻找文章(以及thisthis以及其他300个重复的问题)并挑选最好的文章来展示你的老板。

如果你真的无法说服你的老板,那么你就完成了。鉴于已经指定了什么,这是有效的。鉴于实际上可能会或可能不会实现的目标,任何缺乏思维阅读都将起作用。当你发现越来越多的真实案例失败时,你可以通过在正则表达式本身添加越来越复杂的替换和/或上下文来破解它,或者可能使用一系列正则表达式和后置过滤器,直到最后你得到厌倦了,发现自己找到了更好的工作。

答案 2 :(得分:0)

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

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

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

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