Извлечение значений типа Float из String в Python (и, возможно, с использованием Regex) - PullRequest
2 голосов
/ 16 октября 2019

У меня проблема с созданием функции, которая принимает строку, содержащую значения длины (например: '32 .0 мм / 1.259 "`), и возвращает только значение в мм .

Мой текущийФункция parse может обрабатывать только строки, имеющие только значение мм , но только если существуют значения мм и дюйма .

Любая помощь приветствуется!

Шаблон регулярного выражения: re.sub("[^0-9.\-]", "", str)

import re

def parse(str):
    if not str:
        return None
    str = str.lower()
    return float(re.sub("[^0-9.\-]", "", str))

tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']
for s in tests: 
    print( parse(s) )

Ожидаемый результат

12.3
12.3
32.0
32.0

Фактический объем производства

12.3
12.3
ValueError: could not convert string to float: '32.01.259'

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Просто упростите свой шаблон регулярных выражений до следующего:

re.sub("mm.*", "", str)

... и вы получите ожидаемый результат

1 голос
/ 16 октября 2019

На самом деле вы можете указать регулярному выражению перехватить значение с плавающей запятой / int, которое находится прямо перед целым словом mm:

re.search(r"([0-9]+(?:\.[0-9]+)?)\s*mm\b", text.lower())

См. Демонстрационную версию регулярного выражения .

Здесь

  • ([0-9]+(?:\.[0-9]+)?) - Группа 1: цифры 1+, за которыми следует необязательная последовательность цифр . и 1+
  • \s* - 0+ пробелов
  • mm\b - mm и граница слова.

См. Демонстрационную версию Python :

import re

def parse(text):
    if not text:
        return None
    match = re.search(r"([0-9]+(?:\.[0-9]+)?)\s*mm\b", text.lower())
    if match:
        return float(match.group(1))
    return text

tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']
for s in tests: 
    print( parse(s) )
1 голос
/ 16 октября 2019

Вы можете искать соответствующий шаблон вместо использования sub, например:

import re


def parse(s):
    if not s:
        return None
    s = s.lower()
    return float(re.search("(\d+\.\d*\s*)mm", s).group(1))


tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']

print([parse(test) for test in tests])

Выход

[12.3, 12.3, 32.0, 32.0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...