gpt4 book ai didi

Python 正则表达式 ?操作: is there a return preference, 0还是1?

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:21 24 4
gpt4 key购买 nike

这道题是关于“?”操作的。在我之前的问题中,有人错误地将我的问题标记为重复。所以我重新打开这个问题寻求答案。

我想问为什么第一个表达式不从字符串'axxxxxbcd'输出('a', 'b','c','d')。

import re
match = re.findall(r'(a).*?(b)?.*?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd
awsbdfdfdcd')
print (match)

输出[1]: [('a', '', '', 'd'), ('a', '', 'c', 'd'), ('a', '', '', 'd'), ('a', '', '', 'd'), ('a', '', '', 'd')]

import re

match = re.findall(r'(a).*?(b)?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd awsbdfdfdcd')
print (match)

输出[2]: [('a', '', '', 'd'), ('a', 'b', 'c', 'd'), ('a', '' , '', 'd'), ('a', '', '', 'd'), ('a', 'b', '', 'd')]

@艾萨克

最佳答案

通过将正则表达式的每个元素括在捕获括号中,您可以更好地理解正在发生的情况:

import re

rgx1 = re.compile(r'(a)(.*?)(b)?(.*?)(c)?(d)')
m1 = rgx1.search('axxxxxbcd')
print(m1.groups())

输出:

('a', '', None, 'xxxxxb', 'c', 'd')

发生的情况是这样的:

# Group 1: 'a'
# Group 2: capture as little as possible, so we get ''
# Group 3: 'b' is not present, but it's optional, so we get None
# Group 4: 'xxxxxb'
# Group 5: 'c'
# Group 6: 'd'

为什么第 4 组最终会得到内容,而不是第 2 组?最初,它们是相同的,捕获尽可能少的内容(什么都不捕获),但这将导致整个正则表达式失败。因此,引擎必须开始扩展组 2 或组 4。根据这个示例,引擎似乎首先扩展后一组 - 但我不知道这种情况的精确实现规则是什么。为了证明这两个群体确实追求非贪婪策略,您可以在字符串前面添加一个 d:例如,使用输入文本 axxdxxxbcd。在这种情况下,第 4 组最终只保留 xx

以下方法可能会满足您的要求:

rgx1 = re.compile(r'(a)(?:.*?(b)|.*?)(?:.*?(c)|.*?)(d)')
m1 = rgx1.search('a...b...cd')
print(m1.groups()) # Output: ('a', 'b', 'c', 'd')

但我可能不会那样解决问题。每个(或几乎每个)元素都是可选的正则表达式通常很难正确执行。有时,您最好在几个简单的阶段中解析文本,而不是在一个大的正则表达式中。

关于Python 正则表达式 ?操作: is there a return preference, 0还是1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45993095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com