我的正则表达式仅在我不包括“或”时才匹配选择;但是我需要包含它,因为我需要匹配不同的字符串。
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
我无法弄清楚为什么第一次尝试不能匹配任何东西。谁知道为什么?
答案 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))