为什么我的正则表达式返回None?

时间:2017-09-15 21:30:58

标签: python regex python-2.7

我的正则表达式仅在我不包括“或”时才匹配选择;但是我需要包含它,因为我需要匹配不同的字符串。

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

我无法弄清楚为什么第一次尝试不能匹配任何东西。谁知道为什么?

2 个答案:

答案 0 :(得分:0)

在第一个正则表达式中,第1组在|之前,因此它位于包含\.s的分支中。您的字符串的任何部分都不能与之匹配(您没有文字.后跟文字s),因此整个分支都会失败。另一个分支成功,但它有一个不同的组号,让您知道哪个替代方案有效。

答案 1 :(得分:0)

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

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

您可以将匹配存储到变量中,然后使用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))