gpt4 book ai didi

python - 正则表达式/Python - 为什么在这种情况下捕获非捕获组?

转载 作者:行者123 更新时间:2023-11-28 22:41:49 25 4
gpt4 key购买 nike

这个原始数据数组的每个元素都被正则表达式解析

['\r\n\t\t\t\t\t\t', 
'Monday, Tuesday, Wednesday, Thursday, Friday, Saturday:',
' 12:00 pm to 03:30 pm & 07:00 pm to 12:00 am\t\t\t\t\t',
'\r\n\t\t\t\t\t\t',
'Sunday:',
' 12:00 pm to 03:30 pm & 07:00 pm to 12:30 am\t\t\t\t\t']

这是我的正则表达式 (\\r|\\n|\\t)|(?:\D)(\:)

https://regex101.com/r/fV7wI2/1

enter image description here

请注意,我试图在星期六之后匹配 :,但不匹配时间格式中的 :,例如 12:00

虽然上图正确地对捕获组/非捕获组进行了分类

在运行 re.sub("(\\r|\\n|\\t)|(?:\D)(\:)",'',"Monday, Tuesday, Wednesday, Thursday , 周五, 周六:")

返回

'星期一、星期二、星期三、星期四、星期五、星期六'(星期六后缺少 'y')

代替

'周一、周二、周三、周四、周五、周六'

为什么会这样?

最佳答案

如果你想检查一个子字符串的存在/不存在,但你需要使用后视而不是非捕获组,但将它从匹配中排除:

import re
s = "Monday, Tuesday, Wednesday, Thursday, Friday, Saturday:"
print(re.sub(r"[\r\n\t]|(?<!\d):",'',s))
# ^^^^^^^
# Result: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

参见 IDEONE demo

在这里,(?<!\d)仅检查冒号前的字符是否不是数字。

此外,交替涉及额外的开销,字符类 [\r\n\t]更可取,并且您不需要任何捕获组(圆括号),因为您根本没有使用它们。

另外,请注意正则表达式是用原始字符串文字初始化的,以避免过度转义。

一些 more details from Python Regular Expression Syntax关于非捕获组负面回顾:

(?<!...)
- Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.

(?:...)
- A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.

因为后视是零宽度断言(=返回truefalse的表达式,而无需在字符串中进一步移动索引) ,在您想要检查但不想匹配的情况下,它们正是您所需要的。非捕获组将消耗部分字符串,因此将成为匹配的一部分。

关于python - 正则表达式/Python - 为什么在这种情况下捕获非捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32266440/

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