如何使用“|”正确分组 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一个只有一个元素的列表。
我想将不同的正则表达式匹配到一个字符串。例如
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一个只有一个元素的列表。