RegEx для соответствующих температур (° C) - PullRequest
2 голосов
/ 08 мая 2019

Я хотел бы получить все диапазоны температуры / температуры с пробелами между ними и без них.На данный момент я могу получить те без пробелов между ними, используя:

re.findall(r'[0-9°c-]+', text)

enter image description here

Что мне нужно добавить в регулярное выражение, напримерчто я могу получить те с пробелами между ними, а также правильно?Например, 50 °, ° C следует рассматривать как целое, а не как три части.

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Попробуйте использовать этот шаблон:

\d+°c(?:\s*-\d+°c)?

Пример сценария:

input = "It is 50°c today.  One range is 30°c-40°c and here is another 10°c -20°c"
matches = re.findall(r'\d+°c(?:\s*-\d+°c)?', input)
print(matches)

['50\xc2\xb0c', '30\xc2\xb0c-40\xc2\xb0c', '10\xc2\xb0c -20\xc2\xb0c']
1 голос
/ 08 мая 2019

Это выражение может помочь вам сделать это:

(([0-9°c\s]+)(?:-[0-9°]+c))|([0-9°\s]+c)

enter image description here

Graph

Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения в этой ссылке , если хотите знать:

enter image description here

Пример теста

const regex = /(([0-9°c\s]+)(?:-[0-9°]+c))|([0-9°\s]+c)/gm;
const str = `This is some temperature 30°c-40°c. 50 ° c. 30°c -40°c`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Python Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(([0-9°c\s]+)(?:-[0-9°]+c))|([0-9°\s]+c)"

test_str = "This is some temperature 30°c-40°c. 50 ° c. 30°c -40°c"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
1 голос
/ 08 мая 2019

Вы можете использовать

-?\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']
...