Как извлечь числа из строки в Python - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть строка с координатами:

str='(707.027,949.189),(598.919,6.48649)'

Я хочу извлечь значения, но в скобках сложно обойти эту проблему. Я попробовал следующее:

str.split(",") which gives ['(707.027', '949.189)', '(598.919', '6.48649)']
str.split(",\(\)") which gives ['(707.027,949.189),(598.919,6.48649)']

Ответы [ 3 ]

3 голосов
/ 12 ноября 2019

Ваша строка является допустимым литералом Python, поэтому попробуйте ast.literal_eval :

>>> from ast import literal_eval
>>> s = '(707.027,949.189),(598.919,6.48649)'
>>> literal_eval(s)
((707.027, 949.189), (598.919, 6.48649))

Это анализирует s как код Python и оценивает его (безопасно, как буквальное значение)), что приводит к кортежу кортежей.

1 голос
/ 12 ноября 2019

Хотя в этом случае вы можете использовать eval, это, как правило, небезопасный способ работы с данным типом данных, особенно если строка, которую вы пытаетесь интерпретировать, отсутствует в вашем коде или введена вами.

Вот решение с регулярным выражением, как вы и просили:

import re

subject = '(707.027,949.189),(598.919,6.48649)'
match = re.search(r"\(([\d.]+),([\d.]+)\),\(([\d.]+),([\d.]+)\)", subject)

numbers = []
p1, p2 = tuple(), tuple()
if match:
    numbers = [float(match.group(n)) for n in range(1, 5)]
    # or
    p1 = (float(match.group(1)), float(match.group(2)))
    p2 = (float(match.group(3)), float(match.group(4)))

print(numbers, p1, p2)
1 голос
/ 12 ноября 2019

Python Встроенная функция eval может сделать это, она разбирает строку в код.

>>> s = '(707.027,949.189),(598.919,6.48649)'
>>> eval(s)
((707.027, 949.189), (598.919, 6.48649))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...