Python регулярное выражение, чтобы игнорировать шаблон даты - PullRequest
1 голос
/ 22 января 2020

Пример данных:

Weight Measured: 80.7 kg (11/27/1900 24:59:00)
Pulse 64 \F\ Temp 37.3?C (99.1 ?F) \F\ Wt 101.2 kg (223 lb)
Weight as of 11/11/1900 72.2 kg (159 lb 1.6 oz)
Resp. rate 16, height 177.8 cm (5' 10"), weight 84.7 kg (186 lb|
11.2 oz)
And one extra weight example 100lbs

Частично работающее регулярное выражение:

\b(?i)(?:weight|wt)\b(?:.){1,25}?\b(\d+\.?(?:\d+)).*?(\w+)\b

Токовый выход:

('80.7', 'kg'), ('101.2', 'kg'), ('11', '11'), ('84.7', 'kg'), ('100', 'lbs')

Ожидаемый выход:

('80.7', 'kg'), ('101.2', 'kg'), ('72.2', 'kg'), ('84.7', 'kg'), ('100', 'lbs')

Как мне заставить мое текущее регулярное выражение игнорировать даты и записать следующее значение? Кроме того, как мне сделать это регулярное выражение, чтобы остановить сопоставление в конце строки?

1 Ответ

1 голос
/ 22 января 2020

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

re.findall(r'(?i)\bw(?:eigh)?t\b.{1,25}?\b(?<!\d/)(\d+(?:\.\d+)?)(?!/?\d)\s*(\w+)', text)

См. Демоверсию regex

Подробности

  • (?i) - аналогично re.I - режим без учета регистра для
  • \b - граница слова
  • w(?:eigh)?t - wt или weight
  • \b - граница слова
  • .{1,25}? - любые от 1 до 25 символов, кроме символов перевода строки, как можно меньше
  • \b - граница слова
  • (?<!\d/) - отрицательный вид сзади, который не соответствует совпадению, если непосредственно слева от текущего местоположения есть ди git и /
  • (\d+(?:\.\d+)?) - Группа 1: одна или несколько цифр, за которыми следует необязательный последовательность точек и одной или нескольких цифр
  • (?!/?\d) - отрицательный прогноз, который не дает совпадения, если непосредственно справа от текущего местоположения есть необязательные / и ди git
  • \s* - 0+ пробелов
  • (\w+) - Группа 2: одна или несколько букв, цифр или подчеркиваний.

См. Python demo :

import re
text = """Weight Measured: 80.7 kg (11/27/1900 24:59:00)\nPulse 64 \F\ Temp 37.3?C (99.1 ?F) \F\ Wt 101.2 kg (223 lb)\nWeight as of 11/11/1900 72.2 kg (159 lb 1.6 oz)\nResp. rate 16, height 177.8 cm (5' 10"), weight 84.7 kg (186 lb|\n11.2 oz)\nAnd one extra weight example 100lbs"""
print(re.findall(r'(?i)\bw(?:eigh)?t\b.{1,25}?\b(?<!\d/)(\d+(?:\.\d+)?)(?!/?\d)\s*(\w+)', text))
# => [('80.7', 'kg'), ('101.2', 'kg'), ('72.2', 'kg'), ('84.7', 'kg'), ('100', 'lbs')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...