22

標準形式が次のようなデータを解析しています10 pizzas。場合によっては、データが正しく入力され、5pizzas代わりに5 pizzas. このシナリオでは、ピザの数を解析したいと考えています。

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

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

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

4

4 に答える 4

33

文字列を数字で分割する方法を求めていますが、この例では、実際に必要なのは最初の数字だけです。これは次の方法で簡単に実行できますitertools.takewhile()

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

これは非常に理にかなっています。私たちが行っているのは、文字列が数字であるときに文字列から文字を取得することです。これには、最初の数字以外の文字に到達するとすぐに処理を停止するという利点があります。

後のデータも必要な場合は、探しているものが単純なリスト内包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
于 2012-12-02T21:04:34.447 に答える
23

re.split文字列を数字で分割するには、正規表現で使用できます\d+

>>> 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.search

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

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

于 2012-12-02T21:04:26.707 に答える
3

正規表現はどうですか?

reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)')
result = reg.search(str)
if result:
    numbers = result.group('numbers')
    rest = result.group('rest')
于 2012-12-02T21:04:04.403 に答える