正規表現における「.」、「?」、および「*」の違いは何ですか?

正規表現における「.」、「?」、および「*」の違いは何ですか?

これら 3 つの要素 (メタ文字と呼ばれるのでしょうか?) の違いについて例を挙げて教えていただけますか?

それがすべてか何もないかを意味することはわかっています*が、それについて考える正しい方法かどうかはわかりません。一方、 と.?同じに見えます。これらは 1 つの文字と一致しますよね?

答え1

混乱しているかもしれない正規表現シェルグロブ

正規表現構文では、.任意の1文字(通常は改行文字を除く)を表しますが*数量詞先行する正規表現アトム(文字またはグループ)の0個以上を意味します。0?個以上を意味する量指定子です。1つ先行するアトムのインスタンス、または(それをサポートする正規表現のバリアントの場合)修飾子量指定子の動作を非貪欲に設定します。

シェル グロブでは、?は単一の文字 (正規表現の など.) を表し、 は*0 個以上の文字のシーケンス (正規表現 と同等.*) を表します。

参考になると思われる参考資料をいくつか挙げます。http://www.regular-expressions.info/quickstart.htmlそしてhttp://mywiki.wooledge.org/glob

答え2

直接撮影ウィキペディア:

? 疑問符は、前の要素が 0 回または 1 回出現することを示します。たとえば、colou?r は「color」と「colour」の両方に一致します。

*アスタリスクは、前の要素が 0 回以上出現することを示します。たとえば、ab*c は「ac」、「abc」、「abbc」、「abbbc」などに一致します。

大きな違いは、アスタリスクが一致することです0以上出現回数、疑問符は一致するゼロか1か発生。次の 2 つの例を比較してください。

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

colouur文字u(修飾子の前の要素)が複数回出現するため?、 とは一致しません?が、 とは一致します。*

同様の例:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

同じWikipediaのページから:

任意の 1 文字と一致します (多くのアプリケーションでは改行文字が除外され、どの文字が改行文字とみなされるかはフレーバー、文字エンコード、およびプラットフォームによって異なりますが、改行文字は含まれていると想定しても問題ありません)。POSIX 括弧式では、ドット文字はリテラル ドットと一致します。たとえば、ac は「abc」などに一致しますが、[ac] は「a」、「.」、または「c」にのみ一致します。

この例では、

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

最後の部分は、match any line that has "colou", plus any character, plus letter "r"

結論

質問: 「「*」がすべてか何もないかを意味することは知っていますが、それが正しい考え方かどうかわかりません。一方で、「.」と「?」は同じに見えます。」 ご覧のとおり、ドットとアスタリスクはまったく同じではありません。ドットは、特定の位置を占めている可能性のある任意の文字に対して機能しますが、疑問符は、先行する要素に対して機能します。

答え3

注:Examples provided are in Python.コンセプトは同じままです。

'.'一致するシンボルを除く任意の文字に一致します改行文字(これもre.DOTALLPythonの引数で上書きできます)。そのため、ワイルドカード

'*'数量詞(要素が出現する頻度を定義します)。{0,}

その意味は「0回以上一致」—星の前のグループは、テキスト内で何回でも出現できます。完全に存在しない場合もあれば、何度も繰り返される場合もあります。

'?'はまた、数量詞. の略語{0,1}

その意味は「この疑問符の前のグループの 0 個または 1 個と一致します。」次のようにも解釈できる。疑問符の前の部分はオプションです

例えば:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

上記の例の「?」は、その前の 2 桁の数字がオプションであることを示します。これらの数字は出現しないか、最大 1 回しか出現しません。

「.」と「?」の違い:

'.'一致/受け入れ/検証任意の一文字正規表現内で保持されている場所。

例えば:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'のゼロまたは単一の出現を一致/検証します先行するグループ

携帯電話番号の例を確認してください。

も同様です'*'。チェックします先行するグループの0回以上の出現

組み合わせ:

'.*': 利用可能なシーケンスをいくつでも受け入れます。貪欲なアプローチ

'.*?' 最初に一致したシーケンスを受け入れて停止します。非貪欲アプローチ

詳細については、次の 2 つの質問を読んでみてください...

関連情報