Python 非贪婪正则表达式

2024-12-31 08:37:00
admin
原创
110
摘要:问题描述:我如何制作一个像"(.*)"这样的 python 正则表达式,给定"a (b) c (d) e"python 匹配"b"而不是"b) c (d"?我知道我可以使用"[^)]"代替".&quo...

问题描述:

我如何制作一个像"(.*)"这样的 python 正则表达式,给定"a (b) c (d) e"python 匹配"b"而不是"b) c (d"

我知道我可以使用"[^)]"代替".",但我正在寻找一种更通用的解决方案,使我的正则表达式更简洁一些。有什么方法可以告诉 python“嘿,尽快匹配这个”?


解决方案 1:

你寻求全能的*?

从文档中,贪婪与非贪婪

非贪婪限定符*?+???{m,n}?[...] 匹配尽可能少的
文本。

解决方案 2:

>>> x = "a (b) c (d) e"
>>> re.search(r"(.*)", x).group()
'(b) c (d)'
>>> re.search(r"(.*?)", x).group()
'(b)'

根据文档:

' *'、' +' 和 ' ?' 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果 RE<.*>与 ' ' 匹配<H1>title</H1>,它将匹配整个字符串,而不仅仅是 ' <H1>'。在限定符后添加 ' ' 使其以非贪婪或最小方式执行匹配;将匹配尽可能少的字符。在前面的表达式中?使用将仅匹配 ' '。.*?`<H1>`

解决方案 3:

不行吗\(.*?\)?这就是非贪婪语法。

解决方案 4:

使用非贪婪匹配是一个好的开始,但我还建议您重新考虑任何使用.*——那这个呢?

groups = re.search(r"([^)]*)", x)

解决方案 5:

你想让它匹配“(b)”吗?按照 Zitrax 和 Paolo 的建议去做。你想让它匹配“b”吗?

>>> x = "a (b) c (d) e"
>>> re.search(r"((.*?))", x).group(1)
'b'

解决方案 6:

正如其他人所说,在 * 量词上使用 ? 修饰符可以解决您的直接问题,但要小心,您开始误入正则表达式停止工作的区域,而您需要解析器。例如,字符串“(foo (bar)) baz”会给您带来问题。

解决方案 7:

您可以修改正则表达式模式以使用非贪婪量词。
(.*)您可以使用代替(.*?)

以下是解释:

  1. *是一个贪婪量词,它匹配尽可能多的内容(在您的情况下包括括号),直到最后一次出现)

  2. *?是 的非贪婪(或懒惰)版本.*,它匹配尽可能少的字符,同时仍允许整体模式匹配。只要正则表达式模式的后续部分可以匹配,它就会停止。

因此,您的正则表达式模式可以调整为(.*?)如下形式:

import re

input_string = "a (b) c (d) e"
pattern = r'((.*?))'
matches = re.findall(pattern, input_string)

print(matches)  # Output: ['b', 'd']

在这个修改后的模式中r'((.*?))',我们()以非贪婪的方式匹配括号内的子字符串。该.*?部分确保正则表达式引擎在遇到第一个右括号时立即停止捕获字符),从而为您提供仅匹配每对括号内内容的所需结果。

解决方案 8:

首先,我不建议在正则表达式中使用“*”。是的,我知道,它是最常用的多字符分隔符,但它仍然是一个坏主意。这是因为,虽然它确实匹配该字符的任何重复次数,但“任何”包括 0,这通常是您想要抛出语法错误而不是接受的东西。相反,我建议使用符号+,它匹配长度 ≥ 1 的任何重复。更重要的是,据我所知,您正在处理固定长度的括号表达式。因此,您可能可以使用语法{x, y}来具体指定所需的长度。

但是,如果你确实需要非贪婪重复,我建议咨询万能的?。当将其放在任何正则表达式重复说明符的末尾时,将强制正则表达式的该部分找到尽可能少的文本。

话虽如此,我还是会非常小心地使用?它,因为它就像《神秘博士》中的 Sonic Sc​​rewdriver 一样,如果不仔细校准,往往会做出“稍微”不理想的事情。例如,使用您的示例输入,它会识别((1)(注意缺少第二个 rparen)为匹配项。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用