我从正则表达式开始,并喜欢找到这样的标准:
FR ISO 23213:2020或DIN EN 2323-2
我在章节中尝试这样做,这样更容易管理
std_prefix = '[EN|DE|FR| ]?[ISO|DIN][EN|DE|FR| ]?'
std_value = 'd{1,5}(?:[-]d{1,2})?(?:[:]d{4})'
std = ''.join([std_prefix, std_value])
我得到的是:'EN 2323', 'SO 23213'
- 我错过了第一个例子
- 我总是错过结尾:2020或-2,如果有,它是选项
感谢您的一些指导,以进一步微调。
首先,您正在使用字符类([...]
),就好像它们是分组结构(...)
一样。要对多个备选方案进行分组,请使用非捕获组(?:...|...)
。
你可以尝试像
这样的模式b(?:(?:EN|DE|FR)s+(?:ISO|DIN)|(?:ISO|DIN)s+(?:EN|DE|FR))s+d+[-:]d+
参见regex演示。如果您有匹配尾随数字的特定要求,请随意添加限制量词。
细节:
b
- a字边界(?:
-非捕获组启动:(?:EN|DE|FR)s+(?:ISO|DIN)
-EN
,DE
或FR
,然后是一个或多个空格和ISO
或DIN
子字符串|
-或(?:ISO|DIN)s+(?:EN|DE|FR)
-ISO
或DIN
子字符串,一个或多个空格,然后是EN
,DE
或FR
)
-非捕获组结束s+
-一个或多个空白d+
-一个或多个数字[-:]
—-
或:
d+
-一个或多个数字。