Разобрать строку, чтобы найти и удалить поплавок - PullRequest
1 голос
/ 14 февраля 2012

Я создал метод pythod, который будет принимать строку переменной длины, которая всегда будет содержать число с плавающей запятой в конце:

"adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"

ИЛИ

"asdif adfi=9393 adfkdsf:1.84938"

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

def findFloat(stringArg):
    stringArg.rstrip()
    stringArg.replace("-",":")

    if stringArg.rfind(":"):
        locateFloat = stringArg.rsplit(":")

    #second element should be the desired float
    magicFloat = locateFloat[1]
    return magicFloat

Я получаю

magicFloat = locateFloat [1] IndexError: list index outдиапазона

Любые указания о том, как найти поплавок и вернуть его, были бы потрясающими.

Ответы [ 5 ]

1 голос
/ 14 февраля 2012
  1. В Python строки являются неизменяемыми. Независимо от того, какую функцию вы вызываете в строке, фактический текст этой строки не изменяется. Таким образом, методы типа rstrip, replace и т. Д. Создают строку new , представляющую измененную версию. (Вы узнаете об этом, если прочитаете документацию.) В своем коде вы не назначаете результаты этих вызовов нигде в первых двух инструкциях, поэтому результаты теряются.

  2. Без указания количества разбиений rsplit делает то же самое, что и split. Конечно, он проверяет расщепление с конца, но расщепляет его во всех возможных точках, поэтому суммарный эффект тот же. Вам нужно указать, что вы хотите разделить не более одного раза.

  3. Однако, вы все равно не должны этого делать; гораздо более простой способ получить «все после последнего двоеточия или все, что не имеет двоеточия», это использовать rpartition.

  4. На самом деле вам не нужно удалять пробелы с конца для float преобразования. Хотя вы, вероятно, должны на самом деле, вы знаете, выполнить преобразование.

  5. Наконец, нет смысла присваивать переменную только для ее возврата; просто верните выражение напрямую.

Соединяя это, мы получим исключительно простое:

def findFloat(stringArg):
    return float(stringArg.replace('-', ':').rpartition(':')[2])
1 голос
/ 14 февраля 2012

всегда скалы. В зависимости от того, как выглядит число с плавающей запятой (ведущий 0?), Что-то вроде:

magicFloat = re.search('.*([0-9]\.[0-9]+)',st).group(1)

p.s. если вы делаете это много, сначала скомпилируйте регулярное выражение:

re_float = re.compile('.*([0-9]\.[0-9]+)')
# later in your code
magicFloat = re_float.search(st).group(1)
0 голосов
/ 14 февраля 2012

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

>>> st = "adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
>>> float(re.split(r':|\s|-',st)[-1])
1.5698464586545999

Я использовал re.split (pattern, string, maxsplit = 0, flags = 0) , которыеразбить строку по вхождению шаблона.

Здесь шаблон - это ваш разделитель типа :,white-space(\s),-.

0 голосов
/ 14 февраля 2012

Если это всегда в конце, вы должны использовать $ в своем re:

import re
def findFloat(stringArg):
    fl = re.search(r'([\.0-9]+)$', stringArg)
    return fl and float(fl.group(1))
0 голосов
/ 14 февраля 2012

Вы можете сделать это более простым способом:

def findFloat(stringArg):
    s = stringArg.rstrip()
    return s.split('-:')[-1]
  1. rstrip () вернет извлеченную строку, вы должны хранить ее где-то
  2. split () может принимать несколько токенов, вы можете избежать замены, тогда
  3. rsplit () - это оптимизация, но split () [- 1] всегда будет использовать последний элементв разделенном списке
  4. locateFloat не определен, если rfind () не найден
  5. в том случае, если вам нужно найти символ, вы можете написатьif ':' in stringArg: вместо.

Надеюсь, эти советы помогут вам позже:)

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