#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 будет более распространен.