Python Regex для включения/извлечения только чисел, десятичных знаков и дефиса (-)

Я не очень хорошо разбираюсь в регулярных выражениях и пытаюсь, но не могу извлечь только numbers, decimals and - из столбца в Python.

Еще лучше, если пробелы также можно удалить, но даже если и нет, то с этим все равно можно справиться.

Я проверил ^(\d.+)|[-], ^(\d.+)|[-]?[^a-z]+$/i и ^(\d.+)|[-]?(\d+)?, но ни один из них не работал правильно.

Тестовые случаи (в основном это диапазоны из несовместимого формата)

28193.13
28913
28913-13
28193.13-28193.13
28193.13 - 28193.13
28193.13 - 28193.13 / cm
 - 28193.13
 -28193.13
 28913-
 28913 -

Кадр данных

test_df = pd.DataFrame({"Range": [28193.13,28913,'28913-13','28193.13-28193.13',
'28193.13 - 28193.13','28193.13 - 28193.13 / cm', '- 28193.13','28913-','28913 -']})

test_df

Код пробовал: test_df['Range'].str.extract(r"^(\d.+)|[-]?[^a-z]+$/i")

Желаемые результаты в вышеуказанных случаях:

28193.13
28913
28913-13
28193.13-28193.13
28193.13-28193.13
28193.13-28193.13
-28193.13
-28193.13
28913-
28913-

Проблема: я не могу удалить символы из этого 28193.13 - 28193.13 / cm с помощью моего кода регулярного выражения, поскольку желаемым результатом будет 28193.13-28193.13.

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

Цените любую помощь.

🤔 А знаете ли вы, что...
Python имеет множество фреймворков для веб-разработки, такие как Django и Flask.


52
2

Ответы:

Решено

Я думаю, что это хорошее решение для регулярного выражения.


    # Define the regex pattern to match numbers, decimals, and hyphens
    pattern = r"[\d\.]+(?:-\d+)?"
    # Find all matches
    matches = re.findall(pattern, value)
    # Join matches to form the cleaned value
    cleaned_value = ''.join(matches)
    return cleaned_value

Вы также можете решить это немного более надежно:

def clean_value(value):
    # Filter out characters that are not digits, period, or hyphen
    cleaned_value = ''.join([char for char in value if char.isdigit() or char in ['.', '-']])
    return cleaned_value

# Apply the cleaning function to the data
cleaned_data = [clean_value(val) for val in data]```

Используйте re.sub из встроенной документации по регулярным выражениям (re)

Технически re не является регулярным выражением, но для большинства случаев использования re лучше, поскольку оно встроено в «import re» и не требует установки pip.

Документация по ссылке выше:

Верните строку, полученную путем замены крайних левых непересекающихся вхождений шаблона в строке на замену repl. Если шаблон не найден, строка возвращается без изменений. repl может быть строкой или функцией; если это строка, любые символы обратной косой черты в ней обрабатываются. То есть \n преобразуется в один символ новой строки, \r преобразуется в возврат каретки и т. д. Неизвестные escape-символы ASCII-букв зарезервированы для использования в будущем и рассматриваются как ошибки. Другие неизвестные побеги, такие как &, остались в покое. Обратные ссылки, такие как \6, заменяются подстрокой, соответствующей группе 6 в шаблоне.