Python: Как использовать re.search() в составном операторе if (возможно ли это вообще?)

#python #regex

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

Вопрос:

Мне нужно посмотреть, содержит ли строка 2 числа, и если первое число меньше 0,5:

 if re.search('((?:d|[.- ]d|[ -].d)[d.- e]*)[^d.- ] ((?:d|[.- ]d|[- ].d)[d.- e]*)',foil[ifrom],re.IGNORECASE) and float(re.group(1))<0.5:
    #above is wrong: no such thing as re.group(1)...
elif re.search('((?:d|[.- ]d|[ -].d)[d.- e]*)[^d.- ] ((?:d|[.- ]d|[- ].d)[d.- e]*)',foil[midsep 1],re.IGNORECASE) and float(re.group(1))>0.5:
    #also wrong
  

Каков был бы правильный способ сделать это? Возможно ли вообще получить доступ к результатам поиска внутри того же оператора «if»?

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

1. Попробуйте использовать оператор walrus.

2. Всегда используйте необработанную строку при создании регулярного выражения.

3. Вам нужно присвоить результат re.search() переменной и использовать variable.group(1)

4. Я не знаю регулярных выражений, но здесь что-то выглядит абсолютно как проблема XY

Ответ №1:

Используйте оператор walrus в Python 3.8 :

 if (m := re.search(r'..REGEX HERE...', foil[ifrom], re.I)) and float(m.group(1))<0.5:
    print(m.group(0)) # prints match value
elif:
    ...
else:
    ...
  

Объекту данных соответствия присваивается m m.group(1) значение группы 1 и осуществляется доступ к нему, доступное в том же if состоянии.

Быстрый тест в консоли Python:

 >>> import re
>>> s = "20"
>>> if (m := re.search(r'[0-9] ', s)) and int(m.group(0))>5:
...    print(m.group(0))
... else:
...     print("No")
... 
20
>>> 
  

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

1. Приятный код… конечно, выдает синтаксическую ошибку. Это для надстройки Fusion360, я застрял только на Python 3.7. Это будет отличным ответом в будущем для других людей, ищущих эту проблему, хотя, когда 3.8 будет более распространен.