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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1118閲覧

文字列内に存在する数字とアルファベットとカタカナで区切って半角スペースを挿入する方法

mi2

総合スコア63

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2019/05/13 03:55

達成したいこと

AA11BB、アイウ1エオカのように数字とアルファベットとカタカナとスペースが組み合わされたdfが1列あります。

このデータから数字とアルファベットの間に区切りを入れて、

<1列目> <2列目> <3列目> <4列目>
AA11BB AA_11_BB AA11_BB AA_11BB
アイウ1エオカ アイウ_1_エオカ アイウ1_エオカ アイウ_11エオカ

のように、区切りを入れた上で複数の組合せを作成したいです。

考えていること

数字とアルファベットとカタカナについて、正規表現を用いてまずAA11BBにAA 11 BBのようにスペースをいれ、そこから置換のパターンによって生成できるのではないかと考えていますが、その正規表現の方法がうまくできません。

また、組合せに際して、その他よりよい方法等がございましたらご教示いただけたらと思っております。
何卒よろしくお願い致します。

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

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

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

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

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

can110

2019/05/13 05:23

「AA11BBアイウ」というアルファベットとカタカナが並ぶことはないという前提条件でよいでしょうか? (AA_11_BBアイウと区切られてもよい?)
mi2

2019/05/13 05:30

返信ありがとうございます。 > 「AA11BBアイウ」というアルファベットとカタカナが並ぶことはないという前提条件でよいでしょうか? > (AA_11_BBアイウと区切られてもよい?) 理想と致しましては、「AA11BBアイウ」の場合は、AA_11_BB_アイウと区切ることが理想です。
guest

回答2

0

ベストアンサー

KojiDoiさんの回答をもとにして文字列生成まで書きました。
itertools.productを使うと比較的簡単に記述できます。
追記を受けて

かなり泥臭いですが、異なる文字種で区切る処理も書いてみました。

Python

1import re 2import itertools 3 4# 異なる文字種で区切る 5def split(s): 6 rk = re.compile(r'([ァ-ヴ]|ー)') 7 rd = re.compile(r'[0-9]') 8 ra = re.compile(r'[a-zA-Z]') 9 10 lst = [] 11 prev,cur = -1,-1 12 sub = '' 13 for c in s: 14 if rk.match(c): cur = 1 15 elif rd.match(c): cur = 2 16 elif ra.match(c): cur = 3 17 else: cur = 4 18 19 if prev > 0 and prev != cur: 20 lst.append(sub) 21 sub = '' 22 sub += c 23 prev = cur 24 25 if sub: 26 lst.append(sub) 27 28 return lst 29 30lst = split('アイウ1エオカABC') 31print(lst) # ['アイウ', '1', 'エオカ', 'ABC'] 32 33ret = [] 34for tpl in itertools.product(['','_'],repeat=len(lst)-1): 35 s = lst[0] 36 for t,l in zip(tpl,lst[1:]): 37 s += t + l 38 ret.append(s) 39print(ret) 40# ['アイウ1エオカABC', 'アイウ1エオカ_ABC', 'アイウ1_エオカABC', 'アイウ1_エオカ_ABC', 'アイウ_1エオカABC', 'アイウ_1エオ カ_ABC', 'アイウ_1_エオカABC', 'アイウ_1_エオカ_ABC']

投稿2019/05/13 05:29

編集2019/05/13 05:35
can110

総合スコア38234

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

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

mi2

2019/05/13 06:00

ありがとうございます。 今写経させていただいておりますが、とても勉強になります。 すみません、1つの文字列でなく複数行分のデータに対応するには、lst = split('アイウ1エオカABC')の部分にリストで複数行分持たせるしかないですかね。
can110

2019/05/13 06:21 編集

そうですね。後処理の仕方にもよりますが、リストのリストにするのが簡便な方法かと思います。
mi2

2019/05/13 09:35 編集

色々とお教え下さいましてありがとうございました。
mi2

2019/05/13 09:34

すみません、初歩的な質問ですみません。 list = [['aaa11b'],['aaa222ggg']]の形で持たせて突っ込んでいるのですが、想定通りの挙動になりません。 リストの持たせ方が悪いのでしょうか。 いまいちひとつずつの文字列ずつ処理を行っていくイメージがわかっておりませんで、ご教示頂けましたら幸いです。。
can110

2019/05/13 09:59

今直面している問題に絞って別途質問を立てられると回答できるかと思います。
mi2

2019/05/13 10:06

すみません。 ありがとうございます。
guest

0

表題にある「半角スペースを挿入する方法」については、以下のようなコードを思いつきました。「組み合わせ」については泥臭い方法しか思いつかないので、他の方にお譲りします。

python

1import re 2 3a = "AA11BB" 4b = re.sub(r'((?<=\d)\D|(?<=\D)\d)', r' \1', a) 5

投稿2019/05/13 04:40

KojiDoi

総合スコア13669

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

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

mi2

2019/05/13 05:07 編集

ありがとうございます。 表題にある「半角スペースを挿入」については解決することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問