2

正規表現を使用して、文字列が「999.999-A9-Won」の形式であり、空白、タブ、または改行文字がないことを確認したいと思います。

  1. 0 から 9 までの範囲の数字が 2 つまたは 3 つある場合があります。
  2. ピリオド「.」が続きます。
  3. 再び、0 から 9 の範囲の 2 つまたは 3 つの数字が続きます
  4. ハイフン、文字「A」、および 0 ~ 9 の数字が続きます。
  5. この後は何でもできます。

例: 87.98-A8-abcdef

私が今まで思いついたコードは次のとおりです。

testString = "87.98-A1-help"
regCompiled = re.compile('^[0-9][0-9][.][0-9][0-9][-A][0-9][-]*');
checkMatch = re.match(regCompiled, testString);
if checkMatch:
    print ("FOUND")
else:
    print("Not Found")

これはうまくいかないようです。何が欠けているのかわかりません。ここでの問題は、空白、タブ、改行文字をチェックしていないことと、10 進数の前後の整数の数値をハードコーディングしていないことです。

4

2 に答える 2

5

{m,n}パターンが繰り返される回数を指定でき、文字\dクラスはすべての数字に一致します。\S文字クラスは空白以外のものに一致します。これらを使用すると、正規表現を次のように簡略化できます。

re.compile(r'\d{2,3}\.\d{2,3}-A\d-\S*\Z')

式が文字列の最後まで一致するように、\Zアンカーにも注意してください。\S*ここでは空白 (改行、タブなど) を使用できません。これを.match()メソッドと組み合わせると、テストされた文字列のすべての文字がパターンに準拠していることを保証できます。それ以上でもそれ以下でもありません。の詳細については、 search()vsmatch() . を参照してください.match()

小さなデモンストレーション:

>>> import re
>>> pattern = re.compile(r'\d{2,3}\.\d{2,3}-A\d-\S*\Z')
>>> pattern.match('87.98-A1-help')
<_sre.SRE_Match object at 0x1026905e0>
>>> pattern.match('123.45-A6-no whitespace allowed')
>>> pattern.match('123.45-A6-everything_else_is_allowed')
<_sre.SRE_Match object at 0x1026905e0>
于 2012-07-08T17:22:09.577 に答える
3

正規表現を見てみましょう。お望みならば:

「0 ~ 9 の範囲の 2 つまたは 3 つの数字」

正規表現を開始することはできません'^[0-9][0-9][.]。これは、先頭に正確に 2 つの整数がある文字列にのみ一致するためです。正規表現の 2 つ目の問題は[0-9][-]*最後にあります.*編集: 正規表現の空白に関する Martijn Pieters の回答を参照してください。

更新された正規表現は次のとおりです。

testString = "87.98-A1-help"
regCompiled = re.compile('^[0-9]{2,3}\.[0-9]{2,3}-A[0-9]-.*');
checkMatch = re.match(regCompiled, testString);
if checkMatch:
    print ("FOUND")
else:
    print("Not Found")

[すべてをandで囲む必要はありません]。特に、一致させたい文字がわかっている場合は ( part など-A)。さらに:

  • 表記法は次の{m,n}ことを意味します: 少なくともm回数と多くのn回数で一致し、
  • 明示的にドットに一致させるには、ドットをエスケープする必要があります。これが\.上記の正規表現にある理由です。
于 2012-07-08T17:19:13.803 に答える