如何使用“|”正确分组 RegEx?

How can I group RegEx correctly with '|'?

我想将不同的正则表达式匹配到一个字符串。例如

from os import listdir
from os.path import isfile, join
import os
import re

s = "rechnungsnr. 234342341"

re_nu = re.compile(r".?rechnung[s]*\s*nr[.]*[:]*\s*(\w*\d+[-.]?\d*)")

rn = re_nu.search(s)
rechnungsnr = (rn.groups())
print(rechnungsnr)
print(rn)
print(rn.group(1))

这为我提供了正确的组(文本后的数字):

('234342341',)
<re.Match object; span=(0, 22), match='rechnungsnr. 234342341'>
234342341

但是,如果我用“|”扩展正则表达式我得到不同的结果:

s = "rechnungsnr. 234342341"

re_nu = re.compile(r"rechnungs\s?nummer[:]*\s*(\w*\d+[-.]?\d*)|rechnung(?::*)(?:\s*)((?:\w*)(?:\d+)[-.]?(?:\d*))|.?rechnung[s]*\s*nr[.]*[:]*\s*(\w*\d+[-.]?\d*)|   \
                    belegnummer(?::*)(?:\s*)((?:\w*)(?:\d+)[-.]?(?:\d*))|beleg(?:s*)[-.]?nr(?:.*)(?::*)(?:\s*)((?:\w*)(?:\d+)[-.]?(?:\d*))")

rn = re_nu.search(s)
rechnungsnr = (rn.groups())
print(rechnungsnr)
print(rn)
print(rn.group(1))

因为在我要提取的数字之前有 2 个“none”组:

(None, None, '234342341', None, None)
<re.Match object; span=(0, 22), match='rechnungsnr. 234342341'>
None

如何更改代码,使号码始终位于第一组? RegEx 的目标是获取字符串后的数字。该字符串可以是发票编号的任何名称(德语)。例如,数字可以在“rechnungsnummer”之后,也可以在“rechnungs nr”之后。但也在“rechnungs nr:”之后...

由于 rn.groups() 是 return 元组,您可以像这样进行列表理解:

[item for item in rn.groups() if item is not None]

For example the number could come after "rechnungsnummer" but also after "rechnungs nr." but also after "rechnungs nr:" and so on...

如果在所有情况下都是如此,那么列表推导将永远return一个只有一个元素的列表。