如何将正则表达式与“|”正确分组?

2024-09-29 23:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将不同的正则表达式与字符串匹配。比如说

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, '234342341', None, None)
<re.Match object; span=(0, 22), match='rechnungsnr. 234342341'>
None

如何更改代码,使号码始终是第一组?正则表达式的目标是获取字符串后面的数字。该字符串可以是发票编号的任何名称(德语)。例如,数字可以在“rechnungsummer”之后,也可以在“rechnungsnr.”之后,也可以在“rechnungsnr:”之后,等等


Tags: 字符串fromimportrenonesearchos数字
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:34

由于rn.groups()正在返回一个元组,因此您可以执行如下列表理解:

[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...

如果在所有情况下都是这样,那么列表理解将只返回包含单个元素的列表

相关问题 更多 >

    热门问题