🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

2回答

1483閲覧

python:括弧の中は無視するslice

JohnDahs

総合スコア2

Python

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

0グッド

1クリップ

投稿2021/03/14 16:30

編集2021/03/15 07:48

Pythonの文字列置換・正規表現について質問です。

【要求】
あいうえお・かきくけこ・さ「し・す・せ・そ」・たちつてと・なに「ぬ・ね・の」

というような文字列があるとします。
slice関数を使って「・」を基準に分割をしますが、このとき括弧の中はルールを無視するコードを実現したいです。
この例だと、以下の4つに分割されます。

あいうえお
かきくけこ
さ「し・す・せ・そ」
たちつてと
なに「ぬ・ね・の」

【想定される条件】
「」は文字列の中に複数ある
「」の中に・がない場合もある
「」のすぐ隣に・がある場合がありえる
「」は、必ずペアで存在する(カッコが片方しかない文章は対象外)
「」は入れ子にならない(「ああ「いい」うう」など)

正規表現の使用を可能とします。
回答を宜しくお願い申し上げます。

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

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

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

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

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

t_obara

2021/03/15 09:19

ちなみに、以下のように一つのフィールドに複数の「」が含まれる場合も想定するのですか? 'あいうえお・かきくけこ・さ「し・す・せ・そ」・たちつてと・なに「ぬ・ね・の」・「を・は」う・ま「え・う・し」ろ・ふ「く・す」う「の・ば」あい' すでに回答があるように、複数にして対処してはダメなのでしょうか。
guest

回答2

0

ベストアンサー

「」で囲まれた部分とそれ以外をまず切り分け、「それ以外」についてはさらにで分割してその先の処理を進めればよいのではないでしょうか。

全体を丸括弧でくくった正規表現をre.splitで使うと、通常は捨てられてしまう「区切りの文字列」も要素として拾ってくれるようになります。

Python 3.4.10 (default, Oct 4 2019, 19:39:58) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: a = "あいうえお・かきくけこ・さ「し・す・せ・そ」・たちつてと" In [2]: import re In [3]: re1 = re.split('([^・]*「.*?」)', a) In [4]: re1 Out[4]: ['あいうえお・かきくけこ・', 'さ「し・す・せ・そ」', '・たちつてと']

投稿2021/03/14 16:49

編集2021/03/14 17:15
KojiDoi

総合スコア13692

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

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

JohnDahs

2021/03/14 17:03

その場合「」が複数ある場合に対応しにくいのではないでしょうか。 質問文にそのケースを追記しました。
KojiDoi

2021/03/14 17:18

「複数ある場合」が何を指しているのかよくわかりませんが、空き括弧の直前にナカグロ以外が来ることがあることを認識できていなかったので、修正しました。
JohnDahs

2021/03/15 07:53

回答をありがとうございます。 text = 'あああ・いいい・うう「う・う・う」・「え・え・え・え」' として re.split('([^・]*「.*?」)', text) を実行したとき、 結果が ['あああ・いいい・', 'うう「う・う・う」', '・', '「え・え・え・え」', ''] となりました。 →あああ と いいい が分割しきれていない → "・"が一つの要素として出力される → ””空白文字が出力される などのエラーがありました。 このtextに対する理想的な出力結果は ['あああ', 'いいい', 'うう「う・う・う」', '「え・え・え・え」'] の4要素からなる配列です。
KojiDoi

2021/03/15 07:59

エラーではありません。当然の結果です。 このコードは分割を2段構えで実行することが前提です。最初にそう書いたでしょ。 >「それ以外」についてはさらに・で分割してその先の処理を進めればよい というわけで、この先「・」で分割するコードは頑張って書いてみてください。 正規表現をものにするコツは、何でも一つの正規表現で一発処理してしまおうと思わないことです。
guest

0

本質的な回答は KojiDoi さんが提示されていますのでその後の処理の1例を提示します。

Python

1import re 2 3a = 'あいうえお・かきくけこ・さ「し・す・せ・そ」・たちつてと・なに「ぬ・ね・の」' 4lst = re.split('([^・]*「.*?」)', a) 5lst2 = [[s] if '「' in s else s.split('・') for s in lst] 6lst3 = [s for ls in lst2 for s in ls if s] 7print(*lst3, sep='\n') 8=> 9あいうえお 10かきくけこ 11さ「し・す・せ・そ」 12たちつてと 13なに「ぬ・ね・の」

投稿2021/03/15 10:06

lehshell

総合スコア1156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問