web-dev-qa-db-ja.com

との差 '。' 、 '?'正規表現の「*」

これらの3つの要素(これらはメタキャラクターと呼ばれますか?)がどのように異なるかについての例を得ることができますか?

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

21
posixKing

Wikipedia から直接取得:

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

* アスタリスクは、先行する要素のゼロ個以上の出現を示します。たとえば、ab * cは「ac」、「abc」、「abbc」、「abbbc」などに一致します。

大きな違いは、アスタリスクが0回以上の出現に一致するのに対し、疑問符は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

同じウィキペディアのページから:

任意の単一文字に一致します(多くのアプリケーションは改行を除外し、正確にどの文字が改行と見なされるかはフレーバー、文字エンコード、およびプラットフォーム固有ですが、改行文字が含まれていると想定しても安全です)。 POSIXブラケット式内では、ドット文字はリテラルドットと一致します。たとえば、a.cは「abc」などと一致しますが、[a.c]は「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"と読みます

結論

あなたは尋ねました:「「*」はすべてまたは何も意味しないことを知っていますが、それについて考える正しい方法であるかどうかはわかりません。他の「。」 & '?'同じようだ。」ご覧のとおり、ドットとアスタリスクはまったく同じではありません。ドットはその特定の位置を占める可能性のある文字で動作し、疑問符は前の要素で動作します。

16

正規表現シェルグロブスを混同している可能性があります

正規表現の構文では、.は任意の1文字(通常は改行文字を除く)を表しますが、*はゼロを意味するquantifierです先行する正規表現atom(文字またはグループ)の複数。 ?は、先行するアトムのゼロまたはoneインスタンスを意味する量指定子、または(それをサポートする正規表現バリアントで)amodifier量指定子の動作を貪欲でないに設定します。

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

役に立つと思われるリファレンスは http://www.regular-expressions.info/quickstart.htmlhttp://mywiki.wooledge.org/glob です

31
steeldriver

注:Examples provided are in Python.概念は変わりませんが。

'.' matching symbol であり、 newline character を除く任意の文字に一致します(これもPythonのre.DOTALL引数でオーバーライドできます)。したがって、 Wildcard とも呼ばれます。

'*' quantifier (要素が発生する頻度を定義します)です。{0、}の略です。

「ゼロ以上に一致」—スターの前のグループはテキスト内で何度でも出現する可能性があることを意味します。完全に存在しないか、何度も繰り返される可能性があります。

'?'は、 quantifier でもあります。{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桁がオプションであることを示しています。

「。」の違いおよび「?」:

'.' matches/accepts/verifies任意の単一文字正規表現で保持している場所。

例えば。:

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

'?'は、その前にあるgroupのゼロまたは1回の出現に一致/検証します

携帯電話番号の例を確認します。

'*'についても同様です。 ゼロまたはそれより前のグループの出現をチェックします

組み合わせ:

'.*':可能な限り多くのシーケンスを受け入れます。貪欲なアプローチ

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

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

5
Dhaval Simaria