8

正規表現を指定して最小長と最大長を見つける方法は?

例えば

[1-9]?[0-9]

この正規表現は、最小 1 (0 または 1 0r 2.... または 9) の文字列長と最大長 2 (10 または 11 または 12 または ......19 または 20 または 21....) を生成できます。 ……または99)

同様に、正規表現を指定して最小長と最大長を計算できる関数を提供できる人はいますか? 以下の正規表現を入力として使用できるのはどれですか?

^[a-zA-Z0-9][a-zA-Z0-9.-]{0,64}[a-zA-Z0-9]$
^[a-zA-Z0-9._-]{1,255}$
^[a-zA-Z0-9 !#$'()*+,./:;=?@\\^_`~-]{1,30}$
^[]a-zA-Z0-9 !#$'()*+,./:;=?@[^_`{|}~-]{0,50}$
^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$
4

3 に答える 3

5

正規表現は、非常に小さな要素のセットで構成されています。

  1. アトム (例:aまたは[a-k]または.),
  2. 選択肢 (例: r1|r2)、
  3. 繰り返し (例: r{3,10}r+r*) r?
  4. (r)反復または選択の対象となるグループ (例: )。
  5. スペシャル (例: ^$)。

非消費先読みなどを追加したくない場合を除き、多かれ少なかれそれで終わりですが、それらは入力例の一部ではないため、これらは考慮しません。

これらはどのくらいの長さ (最小/最大) にすることができますか?

  1. 1 / 1 (原子の大きさは一定)
  2. min(選択肢の r の場合は minlen(r)) / max(選択肢の r の場合は maxlen(r))
  3. minlen(r) * minrepretition / maxlen(r) * maxrepetition
  4. minlen(r) / maxlen(r)
  5. 0 (位置パラメーターは空の文字列に一致します)。

したがって、必要なのは正規表現パーサーです (Hugh Bothwell が彼の回答で提案したように)。次に、上記でスケッチしたルールを使用してこの absy を分析し、指定された正規表現が一致する文字列の最小または最大の長さを見つけることができます。

于 2014-02-28T09:16:17.843 に答える
4

http://pyparsing.wikispaces.com/file/view/invRegex.pyには、pyparsing の正規表現パーサーの開始コードがいくつかあります。やりたいように変更するのは難しくありません。

一部のチュートリアルはhttp://pyparsing.wikispaces.com/Examplesにあります。

于 2014-02-28T00:11:36.957 に答える
2

これらの正規表現を解析して計算するには、正規表現パーサーを構築する必要があるようです。ブラケットを単一の文字として、ブレースを変数 len として、および|'s をより可変性として見なすもの。目の前にたくさんの宿題があるようです。幸運を!

編集、追加のヘルプ。

わかりました、これはおそらくあなたが始めるためのちょっとしたことです:

この正規表現、たとえば:

^[a-zA-Z0-9 !#$'()*+,./:;=?@\\^_`~-]{1,30}$
^^--------one of these characters--^^----^^-end of string
^---start of string                   ^one to thirty times

したがって、この正規表現の長さは 1 ~ 30 文字になります。

それは役に立ちますか?しかし、真剣に、私はこれ以上のことをするつもりはありません。再ドキュメントを読む必要があります: http://docs.python.org/library/re.html

于 2014-02-28T00:00:31.417 に答える