teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

正規表現

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

Python

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

Q&A

解決済

6回答

3583閲覧

正規表現 32文字以下、アンダースコアのみの入力を判定したい Python

tanuux

総合スコア1

Python 3.x

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

正規表現

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

Python

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

0グッド

5クリップ

投稿2022/03/09 04:07

編集2022/03/09 04:15

0

5

Python で正規表現を勉強しているのですが、どうもわかりません。

32文字以下、小文字のアルファベットもしくは、アンダースコア"_"のみ、
アンダースコアは連続で入っていてはいけないという条件の正規表現を書きたいです。
テストデータとして、通るべきデータは、
test_test_test
test
t

以上のようなデータです。

今のところ、このように正規表現を書きました
^a-z_.{,32}$|^[a-z]{,32}$

全然的外れです。
32文字以上でも通りますし、アンダースコア以外の記号も入力出来てしまいます。

ヒントでも構いませんので、どなたか助けてください。
そもそも正規表現のみでやろうとしているのが間違いでしょうか?

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

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

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

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

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

otn

2022/03/09 04:29

a-z と [a-z] は全然違う物ですが、同じだと思っていますか? また、「32文字以下、小文字のアルファベットもしくは、アンダースコア"_"のみ、アンダースコアは連続で入っていてはいけない」のどの部分が、お書きの正規表現のどこに対応するつもりで書いたのでしょう?
tanuux

2022/03/09 06:28

正直に言いますと、何が何に対応するのかもいまいち分からずに、つなぎ合わせたような正規表現です。みなさんにいただいた正規表現をきちんと理解するところから始めます。
guest

回答6

0

手に余る複雑な式を考えてしまってハングアップしてしまうというのは、正規表現を勉強し始めると高い確率で陥る罠です。「たった一個の正規表現で問題の全てを解決」しようと思い過ぎてはいけません。高レベル正規表現魔術を唱えることを目的化させてはいけません。複雑すぎる問題は複数の単純な問題に分解して処理しましょう。

表題であれば、

  1. 32文字を超えていたらアウト
  2. 小文字のアルファベットもしくはアンダースコア以外の文字が現れたらアウト
  3. アンダースコアは連続で入っていたらアウト

こう分解して複数段の条件判定をすればいいでしょう。

それから、メタ文字としての-について認識不足があるような気がしますが、それは別途勉強しましょう。

投稿2022/03/09 04:44

KojiDoi

総合スコア13727

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

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

tanuux

2022/03/09 06:25

正規表現で解決しなければいけないと思いこんで、ハマってしまい数時間を過ごしていました。書いていただいた正規表現を勉強していきます。ありがとうございます。このメタ文字という単語も知りませんでしたので調べます。
guest

0

ベストアンサー

^a-z_.{,32}$|^[a-z]{,32}$
32文字以上でも通りますし、アンダースコア以外の記号も入力出来てしまいます。

それは確認した手段が間違っているのでしょう。

32文字以下、小文字のアルファベットもしくは、アンダースコア"_"のみ、
は、^[a-z_]{,32}$です。空文字列を除外したいなら、{1,32}で。

アンダースコアは連続で入っていてはいけない
は、__の否定です。

Python

1def test(s): 2 return re.search("^[a-z_]{,32}$",s) and not re.search("__",s)

どうしても1つの正規表現で済ませたい特殊事情がある場合は、
今回は"^(?!.*__)[a-z_]{,32}$"でも可能です。

投稿2022/03/09 04:46

otn

総合スコア86329

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

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

tanuux

2022/03/09 06:23

ありがとうございます。書いていただいた正規表現を勉強していきます。
tanuux

2022/03/09 17:48

"^(?!.*__)[a-z_]{,32}$" (?!) この表現にはたどり着いたのですが、どうやって[a-z_]と組み合わせて書くのかが、わかりませんでした。 こちらを見て、とても参考になりましたので、ベストアンサーとさせて頂きます。 他のみなさまも、アドバイスありがとうございました。勉強をがんばります。
otn

2022/03/10 00:56

他の方もお書きですが、1つの正規表現でやらざるを得ない事情でない限りは、複数の正規表現を使った方が良いです。回答に書いた通り、and と not を使う。
tanuux

2022/03/12 02:01

私もこちらの、and と notを使用してるものの方が読みやすいので使おうとしたのですが、 32文字以上を入力した際には、Noneが返ってきて、 アンダースコアが二本はいっている際にはFalseが返ってきます。 この戻り値の取り扱い方で悩んでしまいました。 If return_val is None or not return_val: このような形で処理すること形が、正しいでしょうか? もしくは戻り値をTrueもしくはFalseにまとめる?ようなことは可能でしょうか。
otn

2022/03/12 02:50

> もしくは戻り値をTrueもしくはFalseにまとめる?ようなことは可能でしょうか。 何故まとめたいと思ったのでしょうか? FalseもNoneもどちらも「偽」なので、条件判断に使う限りに於いては区別する必要は無いですが。 return bool(~~~~~) とbool関数を使えばTrueかFalseになります。
tanuux

2022/03/15 23:11

なるほど、そのとおりですね if 〇〇 == None のように書いてしまっていました。おっしゃる通り、ふたつとも偽ですね…ありがとうございます。
guest

0

正規表現はコードの可読性が低くなりがちで、処理速度も遅くなりがちです。簡単に避けられるなら避けたほうがよいでしょう。

この場合、^(?=([a-z]+_)*[a-z]+$)[a-z_]{,32}$ でできると思いますが、自分だったら長さチェックは正規表現ではやらないと思います。

投稿2022/03/09 04:37

編集2022/03/09 06:24
int32_t

総合スコア21929

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

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

tanuux

2022/03/09 06:22

こちらの正規表現を自分で一つずつ理解してみるところから始めます。ありがとうございます
guest

0

すでに解決済みですが、^(?:[a-z]|_(?!_)){,32}$はどうでしょうか。

投稿2022/03/11 19:51

actorbug

総合スコア2479

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

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

tanuux

2022/03/12 02:10

ありがとうございます。 調べてみたのですが、どうもこの「?:」の表現が掴めません・・・。 もしよろしければ、参考リンクもしくはヒントをいただけませんか?
actorbug

2022/03/12 03:17

「?:」が理解できないとのことですが、「?:」を削除した状態なら理解できるでしょうか。 「?:」を削除しても意味はほとんど変わりません。 python公式にも、「普通の丸括弧の、キャプチャしない版です。」と説明されています。 https://docs.python.org/ja/3/library/re.html#regular-expression-syntax
tanuux

2022/03/15 23:16

キャプチャをしないという表現が掴めてませんでした。公式を読み返します。ありがとうございます。?:以外の表現は理解できるようになりました
guest

0

そもそも正規表現のみでやろうとしているのが間違いでしょうか?

そうですね、他の手段があるなら全体の文字数は別途チェックしたほうが早いです。

投稿2022/03/09 04:27

maisumakun

総合スコア146641

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

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

tanuux

2022/03/09 06:21

アドバイスありがとうございます。
guest

0

文の意味が不明です
「32文字以下、小文字のアルファベットもしくは、アンダースコア"_"のみ、
アンダースコアは連続で入っていてはいけない」
通るべきデータとして3通りを挙げていますが
_ (アンダースコア1文字)は通りますか?
「もしくは」、「のみ」、「、」などを正しく使わないと他人には正確に伝わりません

投稿2022/03/15 22:17

hig

総合スコア15

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

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

tanuux

2022/03/15 23:16

わざわざ解決済のものに対して言葉遣いがおかしいですという指摘だけ頂くのは、特にありがたくはないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問