2017-09-15 232 views
0

我的正则表达式只有当我不包含'或'选项时才匹配;但我需要包括,因为我需要匹配不同的字符串。为什么我的正则表达式返回None?

entries[0] = 'ephname = /share/old/eph/2004A.1770.comb' 
print re.search(r'\s?ephname\s?=\s?.*?\.s(\d+).*?\s?|\s?ephname\s?=\s?.*?(\d+) 
\.comb\s?', entries[0]).group(1) 
>>> None 

但如果我这样做,而不是它的工作原理:

print re.search(r'\s?ephname\s?=\s?.*?(\d+)\.comb\s?', entries[0]).group(1) 
>>> 1770 

我想不通,为什么第一次尝试时不匹配任何东西。有人知道为什么

+1

因为[它是在第2组,如果你使用你的第一个正则表达式(HTTPS ://regex101.com/r/Gc2KzX/1)。 –

+0

啊,谢谢!有没有办法让我打印出来,不管它是不是None? –

+0

不知道你的要求是什么,但是[this](https://ideone.com/RCyj1B)会有帮助。 –

回答

0

匹配;它返回一个匹配对象,而不是None;并在该匹配对象上调用.group(1)

但是这里的问题现在有捕获组。第一个是第一个分支,第二个是第二个分支。

可以匹配存储到一个变量,然后使用lastindex property得到最后匹配捕获组的索引:

m = re.search(r'\s?ephname\s?=\s?.*?\.s(\d+).*?\s?' 
       r'|\s?ephname\s?=\s?.*?(\d+)\.comb\s?', entries[0]) 
if m: 
    print(m.group(m.lastindex)) 
0

在第一个正则表达式中,组1位于|之前,所以它位于包含\.s的分支中。没有任何部分字符串可以匹配(您没有字面值.,后面跟着字面值s),因此整个分支都会失败。另一个分支成功了,但是它有一个不同的组号,让你知道哪个方法可行。