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
Author: Maciej
Date: Fri, 10 Jul 2009 19:23
Date: Fri, 10 Jul 2009 19:23
21 lines
1749 bytes
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
Author: Piotr Husiatynski
Date: Fri, 10 Jul 2009 21:14
Date: Fri, 10 Jul 2009 21:14
35 lines
1627 bytes
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
Author: Arkadiusz 'nare' Kindziuk
Date: Fri, 10 Jul 2009 23:49
Date: Fri, 10 Jul 2009 23:49
38 lines
2017 bytes
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
Author: Piotr Husiatynski
Date: Sat, 11 Jul 2009 09:06
Date: Sat, 11 Jul 2009 09:06
61 lines
2789 bytes
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
Author: Maciej
Date: Tue, 14 Jul 2009 14:30
Date: Tue, 14 Jul 2009 14:30
15 lines
1851 bytes
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
Author: Maciej
Date: Tue, 14 Jul 2009 14:37
Date: Tue, 14 Jul 2009 14:37
26 lines
2284 bytes
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