Python повторно ищет соответствие регулярным выражениям

#python #regex

#python #регулярное выражение

Вопрос:

Мне нужно регулярное выражение, которое будет соответствовать строке на основе следующих критериев:

 • must start with ABC, DEF, or GHI
• above must be followed by exactly 1 space character 
• above must be followed by a number>=0 such that if it is an integer with 4  digits 
  then it must be separated by comma (for example) 9,876 or if a decimal, 
  then must have exactly 2 decimal places (for example) 0.99 or 9.80;
  no leading zeroes like 010 or 010.10 are allowed.
  

Я пробовал это, но не соответствует тому, что требуется:

 ((ABC)|(DEF)|(GHI))w[0-9] 
  

В приведенном выше w используется для пробелов, а [0-9] означает 1 или более целых чисел. Я не уверен, как представлять десятичные дроби, ограниченные вышеуказанными требованиями.

Например,

ABC 0,99 должен соответствовать ABC 1,999,889 должен соответствовать DEF 10,00 должен соответствовать DEF 10 должен соответствовать ABC 0,99 не должен соответствовать CYZ 1 не должен соответствовать GHI 0123 не должен соответствовать

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

1.«ровно 1 пробел», разве вы не использовали [ ] бы вместо w ? Кроме того, нет s ли пробелов?

Ответ №1:

Это означает

 ^
(?:ABC|DEF|GHI)
 
(?:
    (?:[1-9],d{3})(?:,d{3})*
    |
    [1-9]d*(?:.d{2})?
)
$
  

Смотрите демонстрацию на regex101.com .

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

1. Не удается найти значения DEF 10.00 и DEF 10 (должны быть сопоставлены, но не совпадают)

2. как уже упоминалось, выше 2 случаев не выполняется

3. @user: я рассмотрю это. Но, пожалуйста, добавьте образцы, которые должны быть сопоставлены, и те, которые не указаны в вопросе.

4. теперь он соответствует ABC 011.11, когда он не должен ему соответствовать

5. теперь он разрешает начальные нули

Ответ №2:

Вы могли бы попробовать следующее выражение:

 ^              LINE START
(ABC|DEF|GHI)  LITERAL CHAR SEQUENCES: [ ABC, DEF, GHI ]
s             WHITE-SPACE
(?!            BEGIN NEGATIVE LOOKAHEAD
  0            LITERAL CHAR: '0'
)              END NEGATIVE LOOKAHEAD
d{1,3}        NUMERIC CHAR: 1-3
(              BEGIN GROUP
  ,            LITERAL CHAR: ','
  d{3}        NUMERIC CHAR: 3
)              END GROUP
*              ZERO OR MORE
(              BEGIN GROUP
  .           LITERAL CHAR: '.'
  d{2}        NUMERIC CHAR: 2
)              END GROUP
?              OPTIONAL GROUP
$              LINE END
  
 #!/usr/bin/env python3

import re

pattern = re.compile(r'^(ABC|DEF|GHI)s(?!0)d{1,3}(,d{3})*(.d{2})?$')

valid = [
  'ABC 1',
  'DEF 1.11',
  'GHI 1,111'
]

invalid = [
  'ABC 01',
  'DEF 1.1',
  'GHI 1111',
  'JKL 1.11'
]

if __name__ == '__main__':
  print('All valid: {}'.format(all(pattern.match(str) for str in valid)))
  print('All invalid: {}'.format(all(not pattern.match(str) for str in invalid)))
  

Тест браузера

 const pattern = /^(ABC|DEF|GHI)s(?!0)d{1,3}(,d{3})*(.d{2})?$/;

const allValid = [
  'ABC 1',
  'DEF 1.11',
  'GHI 1,111'
].every(str => str.match(pattern));

const allInvalid = [
  'ABC 01',
  'DEF 1.1',
  'GHI 1111',
  'JKL 1.11'
].every(str => !str.match(pattern));

console.log({ allValid, allInvalid });