Python正则表达式与其他表达式进行或运算时不匹配group

2024-04-18 10:11:45 发布

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

我一直在调试正则表达式的一个奇怪问题。我把它简化成一个简单的例子。我正在检查一个字符串中是否有四个正则表达式。我的字符串与正则表达式匹配,但我试图提取的括号中的分组值与我编写的代码不匹配。我搞不懂的是,如果我只搜索一个表达式,我要匹配的整个字符串和我要提取的值都会正确计算。但是,当我使用所有四个表达式进行搜索时,字符串仍然匹配[group(0)],但我没有得到需要的字段[group(1)]

#!/usr/bin/python3

import re

data = '<w:t xml:space="preserve">More </w:t>'

text = re.search("<w:p>|<w:p .*?>|<w:t>(.*?)</w:t>|<w:t .*?>(.*?)</w:t>", data)
print("First RE")
print("group(0) " + text.group(0))
try:
    print("group(1) " + text.group(1))
except:
    pass

print("Second RE")
text = re.search("<w:t .*?>(.*?)</w:t>", data)
print("group(0) " + text.group(0))
try:
    print("group(1) " + text.group(1))
except:
    pass

当我运行它时,我得到以下结果:

First RE
group(0) <w:t xml:space="preserve">More </w:t>
Second RE
group(0) <w:t xml:space="preserve">More </w:t>
group(1) More 

我希望两个正则表达式返回相同的结果。有人能解释一下他们为什么不这么做吗?根据文档,OR“|”的优先级很低,所以我不知道其他正则表达式为什么会影响它。谢谢


Tags: 字符串textresearchdata表达式moregroup
1条回答
网友
1楼 · 发布于 2024-04-18 10:11:45

第一个正则表达式中有两个捕获组,第二个正则表达式中只有一个。在您的第一个正则表达式中,您使用的是or,因此当它将表达式与第一个捕获组重新匹配时,它不匹配,因此此捕获组为空,您的第二个捕获组匹配,因此值存储在第二个捕获组中

因此,在第一个regex运行之后,第一个捕获组为空,第二个捕获组被填充

import re

data = '<w:t xml:space="preserve">More </w:t>'
text = re.search("<w:p>|<w:p .*?>|<w:t>(.*?)</w:t>|<w:t .*?>(.*?)</w:t>", data)
print("First RE")
print(text.groups())
print("Second RE")
text = re.search("<w:t .*?>(.*?)</w:t>", data)
print(text.groups())

输出

First RE
(None, 'More ')
Second RE
('More ',)

所以你的问题是你只看第一个捕获组,但是在你的第一个正则表达式中,捕获组是空的。因此,当您在try块中时,您将尝试将"group(1)与第一个捕获组中的值连接起来。但是,您只能连接两个字符串,并且第一个捕获组中的值的类型是None,因此这将触发一个异常TypeError: can only concatenate str (not "NoneType") to str,然后捕获并忽略该异常

这就是为什么你看不到指纹

相关问题 更多 >