Python RexExpression — стандарт Identfy

#python #regex #standards

Вопрос:

Я начинаю с регулярного выражения и хотел бы найти такие стандарты, как:

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’

  • Я скучаю по DIN в первом примере
  • Я всегда пропускаю окончание: 2020 или -2, если оно есть, это варианты

спасибо за некоторые указания по дальнейшей точной настройке.

Комментарии:

1. К вашему сведению, вы можете проверить свое регулярное выражение на своих данных на таких сайтах, как regex101.com .

2.Попробуйте (?:(?:EN|DE|FR|ISO|DIN)s*)*d [:-]?d regex101.com/r/CRGWhC/1

Ответ №1:

Прежде всего, вы используете классы символов ( [...] ), как если бы они группировали конструкции, (...) . Чтобы сгруппировать несколько альтернатив, используйте группы без захвата, (?:...|...) .

Вы можете попробовать такой шаблон, как

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

Смотрите демонстрацию регулярных выражений. Если у вас есть особые требования к соответствию конечным числам, не стесняйтесь добавлять ограничительные квантификаторы.

Подробные сведения:

  • b — граница слова
  • (?: — начало группы без захвата:
    • (?:EN|DE|FR)s (?:ISO|DIN) EN , DE или FR , а затем один или несколько пробелов и либо подстрока ISO или DIN
    • | — или
    • (?:ISO|DIN)s (?:EN|DE|FR) ISO либо DIN подстрока or, один или несколько пробелов, а затем EN , DE или FR
  • ) — конец группы без захвата
  • s — один или несколько пробелов
  • d — одна или несколько цифр
  • [-:] — a - или :
  • d — одна или несколько цифр.