Python 非贪婪正则表达式

2024-12-31 08:37:00
admin
原创
111
摘要:问题描述:我如何制作一个像"(.*)"这样的 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用