首页 > 解决方案 > Python RexExpression - 识别标准

问题描述

我从正则表达式开始,喜欢找到如下标准:

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'

感谢您提供一些进一步微调的方向。

标签: pythonregexstandards

解决方案


首先,您使用字符类 ( [...]) 就好像它们是对构造进行分组一样,(...). 要对多个备选方案进行分组,请使用非捕获组,(?:...|...).

你可以试试这样的模式

\b(?:(?:EN|DE|FR)\s+(?:ISO|DIN)|(?:ISO|DIN)\s+(?:EN|DE|FR))\s+\d+[-:]\d+

请参阅正则表达式演示。如果您对匹配尾随数字有特定要求,请随意添加限制量词。

详情

  • \b- 单词边界
  • (?:- 非捕获组的开始:
    • (?:EN|DE|FR)\s+(?:ISO|DIN)- EN, DEorFR然后是一个或多个空格和一个ISOorDIN子字符串
    • |- 或者
    • (?:ISO|DIN)\s+(?:EN|DE|FR)- 一个ISODIN子字符串,一个或多个空格,然后ENDEFR
  • )- 非捕获组结束
  • \s+- 一个或多个空格
  • \d+- 一位或多位数字
  • [-:]- 一个-:
  • \d+- 一位或多位数字。

推荐阅读