🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
6 messages
6 total messages Started by Maciej Fri, 10 Jul 2009 19:23
[regexp] jak wyciągnąć liczby i znaki między nimi
#26359
Author: Maciej
Date: Fri, 10 Jul 2009 19:23
21 lines
1749 bytes
witam,

chciałbym ze stringa wyciągnąć wszystkie cyfry, z opcją że między nimi
mogą występować "inne" znaki, które również miałyby być zgrupowane.

najlepiej posłużę przykładem - mój string:
s = "1 -5 moze byc rowne , 5 + 1.0"

i efekt jaki chcę uzyskać:
1-5
5
1.0

póki co mam:
r"""(\d+(?:(,|\.|-)\d+))""
ale nie bardzo działa :-(

jak to rozwiązać?
bo przyznam że regexpy to czarna magia dla mnie ;-)

pozdrawiam - Maciej
Re: [regexp] jak wyciągnąć liczby i znaki między nimi
#26360
Author: Piotr Husiatynski
Date: Fri, 10 Jul 2009 21:14
35 lines
1627 bytes
Dnia 10.07.2009 Maciej <ledirinfo@googlemail.com> napisał/a:
> witam,
>
> chciałbym ze stringa wyciągnąć wszystkie cyfry, z opcją że między nimi
> mogą występować "inne" znaki, które również miałyby być zgrupowane.
>
> najlepiej posłużę przykładem - mój string:
> s = "1 -5 moze byc rowne , 5 + 1.0"
>
> i efekt jaki chcę uzyskać:
> 1-5
> 5
> 1.0
>
> póki co mam:
> r"""(\d+(?:(,|\.|-)\d+))""
> ale nie bardzo działa :-(
>
> jak to rozwiązać?
> bo przyznam że regexpy to czarna magia dla mnie ;-)


>>> import re

>>> s = "1 -5 moze byc rowne , 5 + 1.0"

>>> [float(numb) for numb in re.split(r'[^\d\-\.]', s) if numb]
[1.0, -5.0, 5.0, 1.0]




-- 
pozdrawiam
Piotr Husiatyński
Re: [regexp] jak wyciągnąć liczby i znaki między nimi
#26361
Author: Arkadiusz 'nare' Kindziuk
Date: Fri, 10 Jul 2009 23:49
38 lines
2017 bytes
Dnia piątek, 10 lipca 2009 23:14, Piotr Husiatynski napisał(a):

>> chciałbym ze stringa wyciągnąć wszystkie cyfry, z opcją że między
>> nimi mogą występować "inne" znaki, które również miałyby być
>> zgrupowane.
>>
>> najlepiej posłużę przykładem - mój string:
>> s = "1 -5 moze byc rowne , 5 + 1.0"
>>
>> i efekt jaki chcę uzyskać:
>> 1-5
>> 5
>> 1.0

Hmm, Twój efekt rozumiem tak
>>> s="1 -5 moze byc rowne , 5 + 1.0 albo  1. i 1.5.6.7"
>>> re.findall('\d+[\.,\-\d]+\d+|\d+', re.sub(' ', '', s))
['1-5', '5', '1.0', '1', '1.5.6.7']

>>>> s = "1 -5 moze byc rowne , 5 + 1.0"
> 
>>>> [float(numb) for numb in re.split(r'[^\d\-\.]', s) if numb]
> [1.0, -5.0, 5.0, 1.0]
> 

>>> [float(numb) for numb in re.split(r'[^\d\-\.]', '1..0') if numb]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1..0

Prędzej chyba coś takiego:
>>> map(float, re.findall('-?\d+\.?\d*', '1.0 1.2 -4 1. 1.2.'))
[1.0, 1.2, -4.0, 1.0, 1.2]
ale też pytanie czy chcemy znaleść ostatnie 1.0 i 1.2 czy jednak pominąć 
je

-- 
Arkadiusz Kindziuk
Re: [regexp] jak wyciągnąć liczby i znaki między nimi
#26362
Author: Piotr Husiatynski
Date: Sat, 11 Jul 2009 09:06
61 lines
2789 bytes
Dnia 10.07.2009 Arkadiusz 'nare' Kindziuk <nare@europe.earth.net> napisał/a:
> Dnia piątek, 10 lipca 2009 23:14, Piotr Husiatynski napisał(a):
>
>>> chciałbym ze stringa wyciągnąć wszystkie cyfry, z opcją że między
>>> nimi mogą występować "inne" znaki, które również miałyby być
>>> zgrupowane.
>>>
>>> najlepiej posłużę przykładem - mój string:
>>> s = "1 -5 moze byc rowne , 5 + 1.0"
>>>
>>> i efekt jaki chcę uzyskać:
>>> 1-5
>>> 5
>>> 1.0
>
> Hmm, Twój efekt rozumiem tak
>>>> s="1 -5 moze byc rowne , 5 + 1.0 albo  1. i 1.5.6.7"
>>>> re.findall('\d+[\.,\-\d]+\d+|\d+', re.sub(' ', '', s))
> ['1-5', '5', '1.0', '1', '1.5.6.7']
>
>>>>> s = "1 -5 moze byc rowne , 5 + 1.0"
>> 
>>>>> [float(numb) for numb in re.split(r'[^\d\-\.]', s) if numb]
>> [1.0, -5.0, 5.0, 1.0]
>> 
>
>>>> [float(numb) for numb in re.split(r'[^\d\-\.]', '1..0') if numb]
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ValueError: invalid literal for float(): 1..0
>
> Prędzej chyba coś takiego:
>>>> map(float, re.findall('-?\d+\.?\d*', '1.0 1.2 -4 1. 1.2.'))
> [1.0, 1.2, -4.0, 1.0, 1.2]
> ale też pytanie czy chcemy znaleść ostatnie 1.0 i 1.2 czy jednak pominąć 
> je
>

Szczerze mówiąc nie przepadam za regexpami i w zależnosci od tego jak te liczby
mogą być zapisane, niezłym rozwiązaniem może być na przykład:

>>> numbers = []

>>> with open("pep8.py") as foo:
 ..    for line in foo:
 ..        for word in line.split():
 ..            try:
 ..                numbers.append(float(word))
 ..            except ValueError:
 ..                pass
 ..            
 ..            

>>> numbers 




-- 
pozdrawiam
Piotr Husiatyński
Re: jak wyciągnąć liczby i znaki między nimi
#26364
Author: Maciej
Date: Tue, 14 Jul 2009 14:30
15 lines
1851 bytes
On 10 Lip, 23:49, Arkadiusz 'nare' Kindziuk <n...@europe.earth.net>
wrote:

> Hmm, Twój efekt rozumiem tak
>>> s="1 -5 moze byc rowne , 5 + 1.0 albo  1. i 1.5.6.7"
> >>> re.findall('\d+[\.,\-\d]+\d+|\d+', re.sub(' ', '', s))

Idealne! Dziękuję :-)

Jako że nie mam "miejsca" na wywołanie re.sub, zmieniłem nieco i
finalny regexp wygląda tak:
re.search('(\d+[\s\.,\-/\d]+\d+|\d+)', s)

Pozdrawiam,
M
Re: jak wyciągnąć liczby i znaki między nimi
#26363
Author: Maciej
Date: Tue, 14 Jul 2009 14:37
26 lines
2284 bytes
On 11 Lip, 09:06, Piotr Husiatynski <phusiatyn...@gmail.com> wrote:

> Szczerze mówiąc nie przepadam za regexpami i w zależnosci od tego jak te liczby
> mogą być zapisane, niezłym rozwiązaniem może być na przykład:
>
> >>> numbers = []
> >>> with open("pep8.py") as foo:
>
>  ..    for line in foo:
>  ..        for word in line.split():
>  ..            try:
>  ..                numbers.append(float(word))
>  ..            except ValueError:
>  ..                pass
>  ..            
>  ..            
>
> >>> numbers

Dzięki -- pomysłowe rozwiązanie, aczkolwiek nie sprawdzi się dla
powyższego stringa.
Ponieważ, przykład ze spacją, tzn. "1 -5", wyświetli jako dwie
oddzielne cyfry (1.0, 5.0).

Pozdrawiam,
M
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads