質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1445閲覧

pythonで文字と数字が混ざる文章から、文字は1文字ずつ、数字はまとまりで頭から順番に処理する方法

eightharrow

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/18 22:59

pythonで文字と数字が混ざる文章から、文字は1文字ずつ、数字はまとまりで頭から順番に処理する方法を探しています

pythonで文字列を処理しています。文字列を頭の文字から順番に引数として関数に代入していきたいのですが、文字列中に数字が含まれる場合はそれぞれ"ひとまとまり"で処理したいです。
良い方法はないでしょうか?

ソースコードの例

質問内容の理解のためにコードを示します。例えば下記のコードです。

python

1def printer(letter): 2 # 本来は何らかの処理 3 print(letter) 4 5sentence = "きょうは19あしたは20" 6 7for letter in sentence: 8 if not letter.isdecimal(): 9 printer(letter) 10 else: 11 printer(letter)

結果

上記のコードを実行すると

result

123451 69 78910112 120

と出力されますが、

result

1234519 67891020

となるような方法を探しています。
質問内容に不明な点などございましたらコメントください。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

柔軟な文字処理をしたい場合は正規表現を使うのが良いと思います。今回の場合は「数字以外の文字1文字」もしくは「数字の連続」を条件に分ければよさそうです。

python

1import re 2 3sentence = "きょうは19あしたは20" 4result = re.findall(r'\d+|\D', sentence) 5print(result)
['き', 'ょ', 'う', 'は', '19', 'あ', 'し', 'た', 'は', '20']

Python で正規表現を使う場合は re モジュールを用います。数字以外の文字1文字が \D で、数字の連続が \d+ です。それを | のOR条件でつないでいます。正規表現はこのように簡単で強力な処理ができるのでぜひ覚えてみて下さい。

投稿2018/09/18 23:39

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eightharrow

2018/09/19 10:27

素早い回答ありがとうございます!確かに正規表現は強力ですね。文字列をバラして処理することがこれまでなかったので触れる機会がなかったですが、すぐに使いこなせるようになりたいと思います。
guest

0

Python

1from itertools import chain, groupby 2 3s = "きょうは19あしたは20" 4 5it = chain.from_iterable([''.join(g)] if k else g for k, g in groupby(s, lambda c: '0' <= c <='9'))

かな。

実行結果

>>> from itertools import chain, groupby >>> s = "きょうは19あしたは20" >>> it = chain.from_iterable([''.join(g)] if k else g for k, g in groupby(s, lambda c: '0' <= c <= '9')) >>> for i in it: ... print(i) ... き ょ う は 19 あ し た は 20

投稿2018/09/18 23:37

quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eightharrow

2018/09/19 10:35

素早い回答ありがとうございました!!ワンライナーかっこいいですね。イテレータ生成関数が標準ライブラリにあるはずだとか当たりをつけることもできず私はまだまだ力不足を感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問