与其他表达式进行“或”运算后,Python正则表达式与组不匹配

时间:2019-11-06 20:50:29

标签: python regex

我一直在尝试用正则表达式调试一个奇怪的问题。在这里,我将其简化为一个简单的案例。我正在检查四个正则表达式中的任何一个字符串。我的字符串与正则表达式匹配,但是我试图提取的括号中的分组值与我编写的代码不兼容。我不知道的是,如果我只搜索一个表达式,那么我要匹配的整个字符串和要提取的值都将正确计算。但是,当我使用所有四个表达式进行搜索时,字符串仍然与[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“ |”具有较低的优先级,所以我不是为什么/如果其他正则表达式正在影响它。谢谢!

1 个答案:

答案 0 :(得分:2)

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

因此,在第一个正则表达式运行之后,第一个捕获组为空,第二个捕获组已填充。

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,然后您将其捕获并忽略。

这就是为什么看不到印刷品的原因。