Как получить подстроку из моей строки? - PullRequest
0 голосов
/ 05 января 2019

Строковая переменная myvar может иметь следующие значения:

261.30 (NM) / 300.76 (MI) / 483.93 (KM)
952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM)

Мне нужно извлечь числа 483.93 и 1,763.61. Эти числа должны быть преобразованы в числа с плавающей точкой или округлены до целых чисел.

Вот что я попробовал:

mylar = "261.30 (NM) / 300.76 (MI) / 483.93 (KM)"
int(myvar[28:-8])

Работает в первом случае (261.30 (NM) / 300.76 (MI) / 483.93 (KM)). Но это не сработает в случае 952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM). Есть ли общее решение?

Ответы [ 7 ]

0 голосов
/ 05 января 2019

С одной функцией re.search, без замены:

import re

myvar = '952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM)'
num = re.search(r'\/\s+(\d+),?(\d+\.\d+)\s+\(KM\)', myvar)
if num:
    num = float(num.group(1) + num.group(2))

print(num)

Выход:

1763.61
0 голосов
/ 05 января 2019

Вы также можете добиться того же, используя только split ()

str1="261.30 (NM) / 300.76 (MI) / 483.93 (KM)"
last_num_string=str1.split('/')[2].split('(')[0]
last_num_float=float(last_num_string)
print(last_num_float)
0 голосов
/ 05 января 2019

Поскольку за значениями следует (KM), вы можете использовать положительный прогноз:

\S+(?= \(KM\))
  • \S+ Совпадение 1+ непробельных символов
  • (?= \(KM\)) Положительный взгляд, чтобы проверить, что справа есть пробел и (KM)

Например:

regex = r"\S+(?= \(KM\))"
strings = ["261.30 (NM) / 300.76 (MI) / 483.93 (KM)", "952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM)"]

for s in strings:
    matches = re.search(regex, s)
    if matches:
        print(float(matches.group().replace(',', '')))

Это даст вам:

483.93
1763.61

Regex demo | Python demo

0 голосов
/ 05 января 2019

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

([^ ]*)[^\d]*$

Демо

Затем, используя следующий код Python, вы можете преобразовать его в float или int. Я конвертирую его в число с плавающей точкой, поскольку они являются десятичными значениями, но вы можете легко привести их к типу int.

import re

arr = ['261.30 (NM) / 300.76 (MI) / 483.93 (KM)','952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM)']

for s in arr:
 val = re.search(r'([^ ]*)[^\d]*$', s)
 floatval = float(re.sub(r',','',val.group(1)))
 print('Float value: ' + str(floatval))
 print('Int value: ' + str(int(floatval)))

печать

Float value: 483.93
Int value: 483
Float value: 1763.61
Int value: 1763
0 голосов
/ 05 января 2019
import re
m="261.30 (NM) / 300.76 (MI) / 483.93 (KM)"
print(float(re.split('\/',re.sub(',','',m))[2][:-5]))
0 голосов
/ 05 января 2019

Вы можете сделать это с помощью регулярного выражения.

import re

target = '952.27 (NM) / 1,096.09 (MI) / 1,763.61 (KM)'

regex = r'.* \(NM\) \/ .* \(MI\) \/ (.*) \(KM\)'

res_str = re.findall(regex, target)
float_str = res_str[0].replace(',', '') 
result = float(float_str)
0 голосов
/ 05 января 2019

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

myvar2 = myvar.replace("/", "").replace(",", "")
myvar2 = myvar2.split()
# This gives a list like this: ["261.30","(NM)","300.76","(MI)","483.93","(KM)"]
myfloat = float(myvar[4]) # This will return 483.93 on the first string and 1,763.61 on the second.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...