2012-12-02 8 views
10

標準形式が10 pizzasのようなデータを解析しています。場合によっては、データが正しく入力され、5 pizzasの代わりに5pizzasになることがあります。このシナリオでは、ピザの数を解析したいと思います。数字とアルファベットの文字を切り替える文字列の分割

これを行う単純な方法は、文字単位で確認し、数字以外の文字列になるまで文字列を構築し、その文字列を整数としてキャストすることです。

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

これはかなり厄介です。数字の数字からアルファベットの文字に切り替える文字列を分割する簡単な方法はありますか?

答えて

15

あなたは数字上の文字列を分割する方法を尋ねたが、その後、あなたの例では、あなたが実際に欲しいのは、単に最初の数字がありますsense - 私たちがやっていることは、数字である間に文字列から文字を取り出すことです。これは、最初の非数字文字を取得するとすぐに処理を停止するという利点があります。

あなたも、後でデータが必要な場合は、その後、あなたが探していることは、簡単なlist comprehensionで混合itertools.groupby()次のとおりです。

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

あなたが1つの巨大な数を作成する場合:

>>> int("".join("".join(x) for is_number, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit) if is_number is True)) 
98868756 
1

正規表現はどうですか?

reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)') 
result = reg.search(str) 
if result: 
    numbers = result.group('numbers') 
    rest = result.group('rest') 
11

あなたが正規表現\d+re.splitを使用することができます数字で文字列を分割するには:あなたが番号を知っている場合

>>> re.search('\d+', '5pizzas').group() 
'5' 
>>> re.search('\d+', 'foo123bar').group() 
'123' 

:最初の数字の使用re.searchを見つけるには

>>> import re 
>>> def my_split(s): 
    return filter(None, re.split(r'(\d+)', s)) 

>>> my_split('5pizzas') 
['5', 'pizzas'] 
>>> my_split('foo123bar') 
['foo', '123', 'bar'] 

文字列の先頭にある必要がありますの代わりにre.matchを使用することができます。すべての番号を見つけて残りを破棄する場合は、re.findallを使用できます。これは、多くのを作る

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

:これはitertools.takewhile()で簡単に行え、

関連する問題