我有一个字符串
<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />
在 Python 中找到 ABCDXYZ 的正则表达式是什么
不要使用正则表达式来解析 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']
如果您正在寻找该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个重复的问题)并挑选最好的文章展示给您的老板。
如果你真的无法说服你的老板,那么你就完成了。鉴于指定的内容,这是可行的。考虑到可能或可能不是真正的意图,只有读心术是行不通的。当您发现越来越多的实际案例失败时,您可以通过在正则表达式本身上添加越来越复杂的交替和/或上下文来破解它,或者可能使用一系列正则表达式和后过滤器,直到最后你得到厌倦了它,并为自己找到一份更好的工作。
首先,免责声明:您不应该使用正则表达式来解析HTML。您可以为此使用 BeautifulSoup
接下来,如果您真的很想使用正则表达式并且上面是您想要的确切情况,那么您可以执行以下操作:
<a href="[a-zA-Z0-9/]+"><img src="[a-zA-Z0-9/]+" alt="([a-zA-Z0-9/]+)" />
您可以通过匹配对象的组属性访问文本。