Python正则表达式?操作:是否有返回首选项,0或1?

2024-09-26 22:12:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想问一下为什么第一个表达式没有从字符串“axxxbcd”输出('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',',',',','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'、''、''、'、'、'd')、('a'、''、'、'、'、'd')、('a'、'、'、'、'、'、'、'd')]

@艾萨克


Tags: 字符串答案标记importre表达式match错误
2条回答

通过将regex的每个元素都包装在捕获括号中,可以更好地理解发生了什么:

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组?最初,它们是相同的,捕获尽可能少(没有),但这将导致整个regex失败。所以发动机必须开始膨胀第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')

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

你得到这个输出是因为 .*? 匹配任何字符(行终止符除外)

(a).*?(b)?.*?(c)?(d)

Group 1.    0-1 `a`
Group 3.    7-8 `c`
Group 4.    8-9 `d`

第一捕获组(a)

a与字符a字面匹配(区分大小写) .*? 匹配任何字符(行终止符除外) *? 量词-零次和无限次之间的匹配,尽可能少的匹配,根据需要扩展(惰性)

第二捕获组(b)?

什么?量词-0到1次之间的匹配,尽可能多的匹配,根据需要回馈(贪婪) b按字面意思与字符b匹配(区分大小写) .*? 匹配任何字符(行终止符除外) *? 量词-零次和无限次之间的匹配,尽可能少的匹配,根据需要扩展(惰性)

第三捕获组(c)?

什么?量词-0到1次之间的匹配,尽可能多的匹配,根据需要回馈(贪婪) c匹配字符c(区分大小写)

第4捕获组(d) d按字面意思与字符d匹配(区分大小写)

但是如果要从字符串“axxxbcd”输出('a'、'b'、'c'、'd')

正则表达式应该是

 (a).*?(b)?(c)?(d)

Group 1.    0-1 `a`
Group 2.    6-7 `b`
Group 3.    7-8 `c`
Group 4.    8-9 `d`

相关问题 更多 >

    热门问题