質問するログイン新規登録
Python 3.x

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

Python

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

Q&A

解決済

2回答

3830閲覧

pythonの正規表現で括弧の前までとってくる

Sonono

総合スコア85

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/05/31 13:32

0

0

li = ['西大和学園(奈良)1', '膳所(県立)(滋賀)2']

というリストから

li = [['西大和学園', '奈良', '1'], ['膳所', '滋賀', '2']]

というリストを得たいです。

一番目の要素の例で行くと、「奈良」は

m = re.findall(r'(.+)', text)[-1] m = m.strip('()')

でとれましたが、「西大和学園」「1」がとりかたがわかりません。最後の括弧の前と後ろというようにとれればいけるのかなとは思うのですがやり方が全く分からず...。部分的にでも教えていただけると幸いです。

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

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

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

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

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

LouiS0616

2019/05/31 13:50 編集

li[1]の例で、なぜ(県立)が消えたのですか? そのルールに依って回答が変わってきます。
Sonono

2019/05/31 14:16

ありがとうございます。合格実績のデータなのですが、他のデータとの整合上、学校名に(県立)とついている場合のみ(県立)を省いて表示したいと考えています。
guest

回答2

0

[list(re.match(r'([^(]).((.+?))(\d*)', x).groups()) for x in data] では如何でしょう?

イメージ説明

先頭の ( の前の文字列 で学校名がとれます。
末尾の 数字列 で合格者数がとれます。
残りの部分からは、 末尾の()で囲まれた文字列 で県名がとれます。

投稿2019/06/01 00:20

編集2019/06/01 00:29
katoy

総合スコア22328

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

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

Sonono

2019/06/01 03:43

ありがとうございます!参考になります。
guest

0

ベストアンサー

学校名に(県立)とついている場合のみ(県立)を省いて表示したい

先に(県立)だけ除去して、単に括弧で分割するのが一番楽で実際的でしょう。

Python

1import re 2 3li = ['西大和学園(奈良)1', '膳所(県立)(滋賀)2'] 4 5dst = [] 6for e in li: 7 e = e.replace('(県立)', '') 8 dst.append( 9 re.split(r'[()]', e) 10 ) 11 12print(dst)

実行結果 Wandbox

[['西大和学園', '奈良', '1'], ['膳所', '滋賀', '2']]

内包表記を利用して次のように書いても良いです。

Python

1dst = [ 2 re.split(r'[()]', e.replace('(県立)', '')) 3 for e in li 4]

おまけ

括弧の前までとってくる

全体にマッチしてキャプチャを取るのが直接的な方法です。

Python

1dst = [] 2for e in li: 3 e = e.replace('(県立)', '') 4 5 m = re.match(r'(.+?)((.+?))(.+?)', e) 6 if m: 7 dst.append(list(m.groups()))

投稿2019/05/31 14:21

編集2019/05/31 14:33
LouiS0616

総合スコア35678

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

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

Sonono

2019/05/31 14:32

たしかに括弧で分割すればいいですね…!ありがとうございます!おまけの方も正規表現の勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問