#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 });