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

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

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

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

Python

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

Q&A

解決済

3回答

1110閲覧

メタ文字?についての質問

cuteworld

総合スコア32

正規表現

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

Python

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

0グッド

1クリップ

投稿2021/09/26 03:05

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

正規表現のメタ文字?の説明で、「直前のパターンを0もしくは1回繰り返す」と書いてありますが、
山川川、abbなどの表記が当てはまらない理由を教えてほしいです。
どれも一回繰り返している気がします。「山川」川、「ab」b

エラーメッセージ

該当のソースコード

python ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

otn

2021/09/26 03:12

> 山川川、abbなどの表記が当てはまらない理由を教えてほしいです。 どの正規表現に対しての話ですか?
cuteworld

2021/09/26 03:43

? です。これは「直前のパターンを0もしくは1回繰り返す」と説明がされています。
Daregada

2021/09/26 03:47

?は、単独ではなく「直前のパターン」と組み合わせて使うものなので、「正規表現は全体としてどんなパターンになっていますか?」と聞かれています。
cuteworld

2021/09/26 04:06

>「正規表現は全体としてどんなパターンになっていますか?」と聞かれています。 指定例が ab? や 山川? の場合です。この場合、 ab や 山川 は 合致しますが、 abb や 山川川   は合致しないと書かれています。
guest

回答3

0

「直前のパターンを0もしくは1回繰り返す」という説明は、確かに誤解の生じる余地があるかもしれませんね。
より誤解の無い表現をするならば、他の方も書かれているように、「直前のパターンが0回もしくは1回出現する」です。

'*' が「直前のパターンを0もしくは1回以上繰り返す」
'+' が「直前のパターンを1回以上繰り返す」
なので、これらと形式的な一貫性を保つために、同じ「繰り返す」という言葉が使われているのかもしれません。

投稿2021/09/26 04:25

etherbeg

総合スコア1195

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

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

cuteworld

2021/09/26 04:46

>「直前のパターンが0回もしくは1回出現する」 この場合の直前のパターンとは、指定例がab? でしたら b のみでしょうか? それともab を直前のパターンと認識するのでしょうか?私の今の認識は前者です。(bのみ)
etherbeg

2021/09/26 04:50

b のみです。ab を直前のパターンとする場合は (ab)? です。
cuteworld

2021/09/26 04:52 編集

なるほど!ありがとうございます。直前パターンの認識で全て解決しました。
guest

0

正規表現を使って探す場合、「正規表現を扱う関数」と「探したいもの」と「検索される文字列」の三つを使います。

python

1>>> import re 2>>> re.search('語', '日本語') 3<re.Match object; span=(2, 3), match='語'> 4>>> re.search('語', '日本人') 5>>> re.search('語', '英語') 6<re.Match object; span=(1, 2), match='語'> 7

この場合、三つの文に共通して「正規表現を扱う関数」はre.searchで、「探したいもの」は'語'です。
一方、「検索される文字列」は'日本語'、'日本人'、'英語'とそれぞれ異なっています。

「探したいもの」のことをパターンとかパターン文字列とか正規表現パターンと呼びます。また、パターン文字列の一部分のことをパターンと呼ぶこともあります。

ご質問は、「検索される文字列」に'山川川'、'abb'が含まれているときに、'?'というパターン文字列が検索されないのはなぜかという意味に読めました。つまり、

python

1>>> re.search('a?', 'abb') 2<re.Match object; span=(0, 1), match='a'>

で、match='abb'ではなく、match='a'となるのがわからないというように読めました。

その理由は、「直前のパターンを0もしくは1回繰り返す」はパターンの側について書いているのであって、「検索される文字列」について書いているのではないからです。

'a?'というパターンは、まず「a」というパターンがあり、その次には直前のパターンである「a」を0もしくは1回繰り返す、という意味です。つまり、aが0回か1回あるという意味になります。

python

1>>> re.search('a?', 'xbb') 2<re.Match object; span=(0, 0), match=''>

で''が見つかるのはaが0回でも良いからです。

python

1>>> re.search('ab?c', 'acbb') 2<re.Match object; span=(0, 2), match='ac'>

なら、aが1回あり、bが0回か1回あり、cが1回あるというパターンなので'ac'が見つかります。

投稿2021/09/26 04:20

ppaul

総合スコア24670

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

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

cuteworld

2021/09/26 04:41

>re.search('ab?c', 'acbb') ご回答いただきありがとうございます。パターンの定義を認識いたしました。 上記の「c」についてですが、「?」のあとでも認識されるということでしょうか。
guest

0

ベストアンサー

指定例が ab? や 山川?
の場合です。この場合、 ab や 山川 は 合致しますが、 abb や 山川川  
は合致しないと書かれています。

ab?という正規表現パターンは、「aに続いて、bが0回か1回ある」文字列にマッチするパターンです。「a」や「ab」にはマッチしますが、「abb」には(bが2回登場するので)マッチしません。

もしかして、「abbのabにはマッチするではないか」と考えているのでは。この場合のマッチとは、「指定したパターンが対象となる文字列全体とマッチする」ことを意味します。

「文字列の一部にマッチするパターンがあったときに、返り値が真になる」ような機能は、正規表現を利用する関数やメソッドの機能です。

投稿2021/09/26 04:14

編集2023/01/30 19:56
Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問