Вы можете использовать
-?\d+(?:\.\d+)?\s*°\s*c(?:\s*-\s*-?\d+(?:\.\d+)?\s*°\s*c)?
См. Демоверсию regex .
Шаблон состоит из блока -?\d+(?:\.\d+)?\s*°\s*c
, который повторяется дважды (для соответствия необязательной части диапазона) и соответствует отрицательным и дробным значениям температуры:
-?
- необязательный дефис
\d+
- 1+ цифр
(?:\.\d+)?
- необязательная дробная часть
\s*
- 0+ пробелов
°
- символ степени
\s*
- 0+ пробелов
c
- c
char.
(?:\s*-\s*<ABOVE_BLOCK>)?
соответствует 1 или 0 повторениям дефиса, заключенного в 0+ пробелов, а затем в тот же блок, как описано выше.
В Python имеет смысл динамически создавать шаблон:
tb = r'-?\d+(?:\.\d+)?\s*°\s*c'
rx = r'{0}(?:\s*-\s*{0})?'.format(tb)
results = re.findall(rx, s)
Если c
необязательно, заменить \s*c
на (?:\s*c)?
.
Если °
и c
являются необязательными, замените \s*°\s*c
на (?:\s*°\s*c)?
или (?:\s*°(?:\s*c)?)?
.
Вот шаблон температурного блока, где символ градуса и символ c
являются необязательными, но следуют в том же порядке, что и раньше:
tb = r'-?\d+(?:\.\d+)?(?:\s*°(?:\s*c)?)?'
Полный Демонстрационный код Python :
import re
s = 'This is some temperature 30° c - 50 ° c 2°c 34.5 °c 30°c - 40 °c and "30° - 40, and -45.5° - -56.5° range'
tb = r'-?\d+(?:\.\d+)?(?:\s*°(?:\s*c)?)?'
rx = r'{0}(?:\s*-\s*{0})?'.format(tb)
results = re.findall(rx, s)
print(results)
# => ['30° c - 50 ° c', '2°c', '34.5 °c', '30°c - 40 °c', '30° - 40', '-45.5° - -56.5°']
Если символ степени может пропасть, а c
все еще может существовать, переместите границу группировки:
tb = r'-?\d+(?:\.\d+)?(?:\s*°)?(?:\s*c)?'
^-------^^-------^
См. эту демонстрационную версию регулярного выражения и полную демонстрационную версию кода Python :
import re
s = 'This is some temperature 30° c - 50 ° c 2°c 34.5 °c 30°c - 40 °c and "30° - 40, and -45.5° - -56.5° range 30c - 50 °c" or 30c - 40'
tb = r'-?\d+(?:\.\d+)?(?:\s*°)?(?:\s*c)?'
rx = r'{0}(?:\s*-\s*{0})?'.format(tb)
results = re.findall(rx, s)
print(results)
Выход:
['30° c - 50 ° c', '2°c', '34.5 °c', '30°c - 40 °c', '30° - 40', '-45.5° - -56.5°', '30c - 50 °c', '30c - 40']