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

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

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

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

Python

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

Q&A

3回答

4520閲覧

re.sub()を複数回書かず、一括で複数条件文字置換がしたい

Cocode

総合スコア2314

正規表現

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

Python

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

0グッド

0クリップ

投稿2022/11/09 01:58

聞きたいこと

  • 私のコードだとre.sub()を2回書いているので、1回または1行の処理で済ませるスマートな書き方が知りたい。(または不可能な場合は、不可能であるということを知りたい)
  • re.sub()は使用しなくてもいいですが、正規表現を使いたい。

前提条件

  • '1''0'から構成される文字列を戻す関数をつくる。
  • 引数にはランダムな文字列が与えられる。
  • 母音(aeiouAEIOU)は'1'、それ以外の全て(空白なども含む)は'0'に置き換える。
引数に与えられる値戻り値
'amEricA''1010101'
'123abc''000100'
'Hello, world!''0100100010000'

該当コード

python

1import re 2 3def vowel_one(str): 4 str = re.sub(r'[^aeiou]', '0', str, flags=re.IGNORECASE) 5 str = re.sub(r'[^\d]', '1', str) # 問題の部分。2行にわたってre.subを書いていて冗長的に感じる 6 return str

試したこと

正規表現を使用しない別バージョンは、1行で書けました。

python

1def vowel_one(str): 2 return ''.join('1' if c in 'aeiou' else '0' for c in str.lower())

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

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

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

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

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

maisumakun

2022/11/09 02:12

> 正規表現を使いたい。 どういう意図があってでしょうか?
Cocode

2022/11/09 02:13 編集

コメントありがとうございます。正規表現とそのメソッドの練習のためです。
guest

回答3

0

python

1import re 2 3def vowel_one(text): 4 text = re.sub(r'(?i)([aeiou])|(.)', lambda m: '1' if m[1] else '0', text) 5 return text 6 7if __name__ == '__main__': 8 test_data = [ 9 ['amEricA', '1010101'], 10 ['123abc', '000100'], 11 ['Hello, world!', '0100100010000'], 12 ] 13 14 for text, expected in test_data: 15 print(f'{text} =>\n output: {vowel_one(text)}\n expected: {expected}\n') 16 17# 18amEricA => 19 output: 1010101 20 expected: 1010101 21 22123abc => 23 output: 000100 24 expected: 000100 25 26Hello, world! => 27 output: 0100100010000 28 expected: 0100100010000

投稿2022/11/09 05:14

編集2022/11/09 05:21
melian

総合スコア19747

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

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

Cocode

2022/11/09 21:55

回答ありがとうございますm(_ _)m そして質問失礼します! m[1]とはどういう意味ですか?
melian

2022/11/10 00:39 編集

正規表現 (?i)([aeiou]) にマッチする文字になります。マッチしない場合、m[1] は None になりますので 、 lambda m: '1' if m[1] else '0' ここで "0" に置換されることになります。
guest

0

python

1import re 2 3test_data = [['amEricA', '1010101'], ['123abc', '000100'], ['Hello, world!', '0100100010000'], 4 ['AbCDe', '10001'], [' !@# ,.', '000000000'] ] 5 6for s, exp in test_data: 7 t = re.sub(r'.', lambda m: '01'[m[0] in 'aeiouAEIOUaeiouAEIOU'], s) 8 print(t, t == exp)

投稿2022/11/09 03:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Cocode

2022/11/09 21:59

回答ありがとうございますm(_ _)m そして質問失礼します! '01'[m[0] in 'aeiouAEIOUaeiouAEIOU'] ↑この部分が理解できませんでした… ①m[0]とはどういう意味ですか? ②m[0] in 'aeiouAEIOUaeiouAEIOU' ←この部分はなんとなく理解できるのですが、 '01'[...] ←こういう形を始めて拝見しました(文字列と配列がくっついている)。どういう動作でしょうか?
退会済みユーザー

退会済みユーザー

2022/11/09 23:38

m[0]は、正規表現でマッチさせた文字です。 マッチオブジェクトの説明(https://docs.python.org/ja/3/library/re.html#match-objects)の Match.group([group1, ...]), Match.__getitem__(g) を読んでみてください。 このプログラムでは、m.group(), m.group(0), m[0] どれでも同じです。 m[0] in 'aeiou...' で取り出した文字が母音かどうかを判定しTrue/Falseにします。 pythonではTrue==1, False==0なので、文字列 '01' のインデックスとして使用できます。 '01'[False]は'0'になり、'01'[True]は'1'になります。
guest

0

re.subには、置換対象として関数を渡すことができます(Python公式)。

投稿2022/11/09 02:15

maisumakun

総合スコア145183

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

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

Cocode

2022/11/09 21:59

迅速な回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問