page contents

用Python匹配HTML tag的时候,<.>和<.?>有什么区别?

今天咱们聊一个程序员面试时可能会遇到的常见问题——Python用来匹配HTML标签时,<.*>和<.*?>之间的区别。说到这儿,可能有些朋友会想:“这不就是正则表达式的问题吗?怎么好像有点儿复杂?”其实吧,听起来复杂,但只要你搞明白了背后的原理,整个问题就变得简单了。

attachments-2025-04-rX0MzoMJ67ee2bf12d7d8.jpg今天咱们聊一个程序员面试时可能会遇到的常见问题——Python用来匹配HTML标签时,<.*>和<.*?>之间的区别。说到这儿,可能有些朋友会想:“这不就是正则表达式的问题吗?怎么好像有点儿复杂?”其实吧,听起来复杂,但只要你搞明白了背后的原理,整个问题就变得简单了。

1. 正则表达式简介:为何匹配HTML标签

在开始讲区别之前,咱们先来简单聊聊正则表达式。你知道,正则表达式(Regex)是一个强大的工具,能帮助你匹配、搜索、替换字符串。在Python中,正则表达式由re模块提供。我们经常用它来做字符串匹配、分割文本,甚至抓取HTML标签等。

所以当面试官问到“用Python匹配HTML标签”,你脑海中应该立刻想到正则表达式的相关问题了。简单来说,如果你要匹配像<div>、<p>这样的HTML标签,你可能会写个类似的正则:

import re

html = "<div>Hello World!</div><p>Welcome to Python!</p>"

pattern = r"<.*>"

matches = re.findall(pattern, html)

print(matches)

这样,<.*>就能匹配到整个HTML标签。看起来一切都好像很简单,但这里的<.*>有一个非常重要的特点——它是“贪婪”的,接下来的<.*?>就是它的“非贪婪”版本。

2. <.*>:贪婪匹配

说到正则表达式的贪婪和非贪婪匹配,咱们先要搞清楚贪婪匹配是啥。简单来说,贪婪匹配会尽可能地多匹配字符。也就是说,<.*>会匹配整个字符串中第一个<到最后一个>之间的所有内容,哪怕中间有多个HTML标签。嗯...这样就会遇到一个大问题。

例如:

html = "<div>Hello World!</div><p>Welcome to Python!</p>"

pattern = r"<.*>"

matches = re.findall(pattern, html)

print(matches)

输出的结果是:

['<div>Hello World!</div><p>Welcome to Python!</p>']

你看到了吗?它把整个HTML内容都匹配进去了,而不是单独匹配<div>和<p>。这是因为<.*>是“贪婪的”,它会一直尝试去匹配最远的>符号,直到字符串的结尾。所以如果你想要逐一匹配每一个标签,就不能只用<.*>。

3. <.*?>:非贪婪匹配

既然有了贪婪匹配,那非贪婪匹配是怎么回事呢?非贪婪匹配的意思是尽可能少地匹配字符,直到遇到满足条件的位置就停止。因此,<.*?>中的?让*变成了非贪婪模式。

让我们来看个例子:

html = "<div>Hello World!</div><p>Welcome to Python!</p>"

pattern = r"<.*?>"

matches = re.findall(pattern, html)

print(matches)

输出结果:

['<div>', '</div>', '<p>', '</p>']

看看,这下我们成功地逐个匹配到了每一个HTML标签!这里的关键就在于<.*?>中的?,它强制让*变成了非贪婪的,这样每次匹配都会在遇到第一个>符号时就结束匹配。简直是正则界的“小巧精致”,是不是感觉很牛?

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1884 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1884 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章