Python正则表达式非贪..."/> 为什么Python正则表达式中的非贪婪匹配会导致结果丢失?(匹配.贪婪.丢失.导致.正则表达式...) (来自巳月采集器) - 太渊博客
上玄

为什么Python正则表达式中的非贪婪匹配会导致结果丢失?(匹配.贪婪.丢失.导致.正则表达式...) (来自巳月采集器)

随记日常 · 15 天前 · 53 人浏览

图片


图片

巳月采集器官网:https://www.afankq.vip/jieshao

联系QQ:1323961925

为什么python正则表达式中的非贪婪匹配会导致结果丢失?">

Python正则表达式非贪婪匹配陷阱及解决方法

在使用Python正则表达式进行匹配时,非贪婪匹配(+?)有时会产生意想不到的结果,导致部分匹配内容丢失。本文将分析一个案例,并提供解决方案。

问题描述:

用户尝试使用正则表达式提取URL中的文件名:

URL: http://tiebapic.baidu.com/forum/w%3d580/sign=33b74ba68b11728b302d8c2af8fdc3b3/9728d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg?tbpicau=2024-01-18-05_4f80cd1a7f322fc1e38464b6e05d9188

使用的正则表达式:

pattern = re.compile(r'http://tiebapic.baidu.com/(.+?)sign=.+?/(.+?).(.+?)?tbpicau=', re.S)


预期结果: forum/w%3d580/9728d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg

实际结果: forum/w33d580/928d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg

结果丢失了7个字符。

问题分析:

问题根源在于非贪婪匹配.+?结合了.通配符。.匹配任意字符,包括.本身。+?则尽可能少地匹配,导致在遇到第一个.时就停止匹配,从而截断文件名。

解决方案:

避免使用.+?匹配包含特殊字符(如.)的字符串。 更精确的匹配方式是使用字符集排除不需要的字符。 以下提供两种改进后的正则表达式:

方法一:使用字符集排除 /

pattern = re.compile(r'http://tiebapic.baidu.com/(.+?)sign=.+?/([^/]+)?tbpicau=', re.S)


[^/]+ 匹配一个或多个非 / 的字符,有效地提取文件名直到遇到 ?。

方法二:更精准的匹配路径和文件名

pattern = re.compile(r'http://tiebapic.baidu.com/.+/sign=.+?/([^?]+)?tbpicau=', re.S)


这个表达式更直接地匹配路径和文件名,避免了非贪婪匹配的歧义。 . 对 . 进行转义,保证匹配字面意义上的点。 ([^?]+) 匹配除 ? 之外的任何字符,直到 ? 出现。

选择哪种方法取决于具体需求和URL结构的复杂程度。 方法二通常更可靠,因为它更明确地定义了匹配目标。 记住,在正则表达式中,清晰明确的匹配规则比依赖非贪婪匹配更重要。

以上就是为什么Python正则表达式中的非贪婪匹配会导致结果丢失?的详细内容,更多请关注知识资源分享宝库其它

表情
爱心
手势
动物
美食
天气
😀😃😄😁😆😅😂🤣😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛😝😜🤪🤨🧐🤓😎🤩
❤️🧡💛💚💙💜🖤🤍🤎💔❣️💕💞💓💗💖💘💝💟♥️💌💋💯💢💥💫💦💨💤
👋🤚🖐️👌🤌🤏✌️🤞🫰🤟🤘🤙👈👉👆👇☝️👍👎👊🤛🤜👏👐🤲🫶👏
🐶🐱🐭🐹🐰🦊🐻🐼🐨🐯🦁🐮🐷🐸🐵🐔🐧🐦🐤🦆🦅🦉🦇🐺🐗🐴🦄🐝🦋🐞
🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🍅🥑🥦🥬🥒🌶🌽🥐🥯🍞🥖🥨🧀🥚🍳🥞🍔
☀️🌤️⛅️🌥️☁️🌦️🌧️⛈️🌩️🌨️❄️☃️⛄️🌬️💨🌪️🌫️🌈☔️⚡️❄️🌟⭐️🌙🌘🌍🌎🌏🪐🌠

网站已运行 241 天 | 共有文章 587 篇 | 累计访问 4827 人次