Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Splitting a string where it switches between numeric and alphabetic characters

Tags:

I am parsing some data where the standard format is something like 10 pizzas. Sometimes, data is input correctly and we might end up with 5pizzas instead of 5 pizzas. In this scenario, I want to parse out the number of pizzas.

The naïve way of doing this would be to check character by character, building up a string until we reach a non-digit and then casting that string as an integer.

num_pizzas = "" for character in data_input:    if character.isdigit():       num_pizzas += character    else:       break num_pizzas = int(num_pizzas) 

This is pretty clunky, though. Is there an easier way to split a string where it switches from numeric digits to alphabetic characters?

like image 427
Chris Avatar asked Dec 02 '12 20:12

Chris


People also ask

How do I subdivide a string?

The split() method splits a string into an array of substrings. The split() method returns the new array. The split() method does not change the original string. If (" ") is used as separator, the string is split between words.


1 Answers

You ask for a way to split a string on digits, but then in your example, what you actually want is just the first numbers, this done easily with itertools.takewhile():

>>> int("".join(itertools.takewhile(str.isdigit, "10pizzas"))) 10 

This makes a lot of sense - what we are doing is taking the character from the string while they are digits. This has the advantage of stopping processing as soon as we get to the first non-digit character.

If you need the later data too, then what you are looking for is itertools.groupby() mixed in with a simple list comprehension:

>>> ["".join(x) for _, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit)] ['dfsd', '98', 'sd', '8', 'f', '68', 'as', '7', 'df', '56'] 

If you then want to make one giant number:

>>> int("".join("".join(x) for is_number, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit) if is_number is True)) 98868756 
like image 109
Gareth Latty Avatar answered Oct 10 '22 05:10

Gareth Latty