💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a\*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .\* 的本质是“贪婪”的 ``` #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.match('<.*>', s).span() (0, 32) >>> print re.match('<.*>', s).group() <html><head><title>Title</title> ``` RE 匹配 在 "`&lt;html&gt;`" 中的 "&lt;",.\* 消耗掉字符串的剩余部分。在 RE 中保持更多的左,虽然 &gt; 不能匹配在字符串结尾,因此正则表达式必须一个字符一个字符地回溯,直到它找到 &gt; 的匹配。最终的匹配从 "&lt;html" 中的 "&lt;" 到 "&lt;/title&gt;" 中的 "&gt;",这并不是你所想要的结果。 在这种情况下,解决方案是使用不贪婪的限定符 \*?、+?、?? 或 {m,n}?,尽可能匹配小的文本。在上面的例子里, "&gt;" 在第一个 "&lt;" 之后被立即尝试,当它失败时,引擎一次增加一个字符,并在每步重试 "&gt;"。这个处理将得到正确的结果: ``` #!python >>> print re.match('<.*?>', s).group() <html> ``` 注意用正则表达式分析 HTML 或 XML 是痛苦的。变化混乱的模式将处理常见情况,但 HTML 和 XML 则是明显会打破正则表达式的特殊情况;当你编写一个正则表达式去处理所有可能的情况时,模式将变得非常复杂。象这样的任务用 HTML 或 XML 解析器。