питон

Dec. 7th, 2016 07:00 pm
[identity profile] shaihkritzer.livejournal.com posting in [community profile] useful_faq
кто разбирается в регулярных выражениях питон - помогайте.

есть текст формата:

"пыщпыщпыщ: 111.11
олололоо: 222.22
ыыыыыыы: 333.33"

нужно обрезать всё кроме "333.33".

регулярное выражение типа .+?([\d.\d.]+) через echo "%1" выдаёт 111.11, но "нарастить" его по принципу .+?([\d.\d.]+)([\d.\d.]+)([\d.\d.]+) echo %3 не выдаёт 333.33. я получаю либо часть первого числа, либо точку, либо пустоту, либо ошибку. гугление мануалов особо не помогло, да и я не программист.

какое будет корректное выражение для того, чтобы убрать весь текст кроме "333.33"? или хотя бы убрать всё, кроме чисел?

Date: 2016-12-07 04:11 pm (UTC)
From: [identity profile] obrut-mra.livejournal.com
": (\d+\.\d+)"
Или ": (\d+\.\d+)$", если вдруг вернёт не все цифры.

Date: 2016-12-07 06:46 pm (UTC)
From: [identity profile] obrut-mra.livejournal.com
Тогда стоит уточнить язык программирования где это делается форматы могут различаться.

Date: 2016-12-07 05:04 pm (UTC)
From: [identity profile] karpion.livejournal.com
Данный текст описывается выражением:
  • не_пробелы в количестве 1 или более;
  • двоеточие, пробел;
  • не_пробелы в количестве 1 или более;
  • перевод строки;
и так три раза подряд.

Что Вам нужно оставить? Только текст после последнего "двоеточие, пробел"? Или как-то иначе?
Edited Date: 2016-12-07 05:06 pm (UTC)

Date: 2016-12-07 08:38 pm (UTC)
From: [identity profile] karpion.livejournal.com
Я бы тогда сделал "заменить все не_цифры и не_точку на пустую строку. Глобально.
Это если построчно. Но я думаю, дальше Вы сами допилите.

Date: 2016-12-08 07:09 pm (UTC)
From: [identity profile] karpion.livejournal.com
Как Вам вариант: "удалить всё, кроме цифр, точек и пробелов"? Удалять Вы умеете?

Просто я в основном работаю с регексами через grep и sed, а там это немного отличается. Для sed это примерно так:
sed 's/[^0-9. ]//g' ...
(троеточие - это имя файла или перенаправление ввода; а ещё можно брать данные через "|" - но он будет слева от команды). Попробуйте натравить этот вариант на Ваши данные. Правда, он оставит переводы строки - sed работает построчно.

Date: 2016-12-07 05:13 pm (UTC)
From: [identity profile] rambalac.livejournal.com
Чтобы вернуть 333.33 шаблон будет
333\.33

Тяжело, наверное, "программистам", которые не могут выразить даже то, что им нужно.
Небось после несколько часов выяснится, что надо парсить JSON или HTML
Edited Date: 2016-12-07 05:19 pm (UTC)

Date: 2016-12-07 06:13 pm (UTC)
From: [identity profile] ezdakimak.livejournal.com
Не проще вырезать числа, а потом склеить? Не знаю синтаксиса питона, но в яваскрипте вот такое проканает
var str="пыщпыщпыщ: 111.11\
олололоо: 222.22\
ыыыыыыы: 333.33";

str.match(/(\d{3}\.\d{2})/gi);

Date: 2016-12-07 06:16 pm (UTC)
From: [identity profile] ezdakimak.livejournal.com
А, пропустил, если вам надо последнее только число, то надо ещё символ поиска у конца добавить - $
str.match(/(\d{3}\.\d{2})$/gi);

Date: 2016-12-07 06:32 pm (UTC)
From: [identity profile] ezdakimak.livejournal.com
Заменить все что не цифры в яваскрипте опять же.

str.replace(/[^\d\.\s]/gi,''); // " 111.11 222.22 333.33"

Может у вас проблема в том что флаг глобального поиска не стоит? Регулярное выражение перестает работать в конце строки, вот это gi - это глобальный регистронезависимый поиск. В питоне может быть другой символ флага глобального поиска или даже отдельная функция которая игнорирует переносы строк.

Date: 2016-12-07 06:22 pm (UTC)
From: [identity profile] terraon.livejournal.com
/\d{3}+\.\d{2}/ - найдет подстроки формата nnn.nn (3 любых цифры+точка+2 любых цифры)
/333\.33/ - найдет подстроки точно три тройки+точка+2 тройки

Date: 2016-12-15 04:58 am (UTC)
From: [identity profile] terraon.livejournal.com
Я не пишу на питоне, поэтому не могу помочь с примером кода.
Но вообще, функции поиска всех вхождений подстроки возвращают массив строк. Берете первый элемент массива, преобразуете к типу float (у Вас судя по примеру такой тип, если число без точки, то к int) и вычитаете требуемое. Разумеется надо это все сопроводить проверками на наличие требуемого элемента, на то, что он корректно преобразовался в float и т.п.

Date: 2016-12-07 08:00 pm (UTC)
From: [identity profile] white-thesis.livejournal.com
Хинт: до изучения питона и прочих языков программирования очень полезно бывает подтянуть русский.
Ибо если это мыкание и многозначительное пожимание левым плечом (ц) перевести на русский, то станет куда понятнее.

Требуется шаблон regexp, который выбирает из строки текста число с дробной частью, которая отделена точкой. Примеры такой строки см. ниже.

ответ: \d+\.\d+\s*$
и применять его надо к каждой строке текста по отдельности

Date: 2016-12-08 07:05 am (UTC)
From: [identity profile] chva.livejournal.com
Есть такая хорошая программа Regexp Buddy в ней очень удобно настраивать регулярные выражения, она, кроме того, поддерживает грамматику разных ЯП.

Date: 2016-12-08 07:18 am (UTC)
From: [identity profile] onanum.livejournal.com
Не пытайтесь питаться питонами.

Date: 2016-12-08 09:52 am (UTC)
From: [identity profile] onanum.livejournal.com
Мот аналоги где поискать?

Date: 2016-12-09 08:05 am (UTC)
From: [identity profile] necroz.livejournal.com
re.findall('(\d{3}+\.\d{2})', 'ваш текст')
или
re.findall('.*:\s(\d*.\d*)', 'ваш текст') если формат строки постоянен, а количество цифер может меняться.

даст массив значений ['111.11', '222.22', '333.33'] для вашего примера. А дальше еб... делайте с ним что хотите. Надо - склейте через итерацию.
Edited Date: 2016-12-09 08:10 am (UTC)