Матч арифметические операторы только один раз foreach - PullRequest
1 голос
/ 23 сентября 2019

Я должен соответствовать следующему типу строк:

HELLO
HELLO+2.20
HELLO*1.10
HELLO+2.12*2.99
HELLO*2.30+5.40

Оператор "плюс" и "звезда" может быть там только один раз (с их соответствующим количеством), поэтому

HELLO+2.20+3.50
HELLO*2.11+1.25*9.99
HELLO*3.33*4.44

arenНеверные совпадения

Я попробовал это регулярное выражение:

([A-Z]{2,12}(\*(\d+(?:\.\d{1,2})?))?(\+(\d+(?:\.\d{1,2})?))?)

, но сначала сопоставляется только звездный оператор и плюс оператор в конце (оба опционально).Это регулярное выражение не поддерживает этот случай:

HELLO+2.11*3.56

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Более простая альтернатива со встроенными функциями (без поиска по регулярным выражениям):

test_str = '''
HELLO+2.20
HELLO*1.10
HELLO+2.12*2.99
HELLO*2.30+5.40
HELLO+2.20+3.50
HELLO*2.11+1.25*9.99
HELLO*3.33*4.44'''

valid_strings = [s for s in test_str.splitlines()
                 if s and s.count('+') < 2 and s.count('*') < 2]
print(valid_strings)

Вывод:

['HELLO+2.20', 'HELLO*1.10', 'HELLO+2.12*2.99', 'HELLO*2.30+5.40']
0 голосов
/ 23 сентября 2019

Вы можете использовать чередование | для соответствия любому из 2 вариантов + и *

^[A-Z]{2,12}(?:\+\d+\.\d{1,2}(?:\*\d+\.\d{1,2})?|\*\d+\.\d{1,2}(?:\+\d+\.\d{1,2})?)?$

По частям

  • ^ Начало строки
  • [A-Z]{2,12} Совпадение 2-12 символов верхнего регистра
  • (?: Группа без захвата
    • \+\d+\.\d{1,2} Совпадение + 1+цифры . и 1-2 цифры
    • (?:\*\d+\.\d{1,2})? Опционально совпадают с предыдущими, начиная с *
    • | или
    • \*\d+\.\d{1,2} Match * 1+ цифр . и 1-2 цифры
    • (?:\+\d+\.\d{1,2})? Опционально совпадают с предыдущими, начиная с +
  • )? Закрыть группуи сделайте необязательным также совпадение только с 12 прописными буквами
  • $

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...