2

15桁の入力文字列を取得します001230123456789。2つの数字があります。1つ目は00123(最小1桁の非ゼロ桁、最大5桁)、2つ目は0123456789(最小100000000、最大10桁)です。キャプチャされた出力(これらの数値)には、先行ゼロが含まれていてはなりません。

(Pythonで)それを行うためのより簡単でおそらく唯一の適切な方法は、配列スライシングとlstrip()です。

input = "001230123456789"
output = [(input[:5].lstrip('0'), input[5:].lstrip('0'))]
# ('123', '123456789')

しかし、私には正規表現で同じことをするタスクがあります。

貪欲なオプションを試したかどうかにかかわらず、ゾムゼロが残っていることに固執しています。私はそれで終わりました:0{0,4}([1-9]\d{0,4})0?([1-9]\d{8,9}) そしてそれは私のテストの3/6に合格します:

000010111111111 -    ('10', '111111111')     (should be ('1', '111111111'))
116402151672479 - OK ('11640', '2151672479')
006421651672479 -    ('6421', '651672479')   (should be ('642', '1651672479'))
712120751672479 - OK ('71212', '751672479')
712121551672479 - OK ('71212', '1551672479')
006400351672479 -    ('6400', '351672479')   (should be ('640', '351672479'))

正規表現だけでそれを行う方法はありますか?

pastie.orgのテストと期待値を含む完全なサンプルソースコード。

4

4 に答える 4

4

どうぞ。

    /^0*(\d{1,5})(?<=.{5})(?<!00000)(?!00)(?=\d{10}$)0*(.+)/
      | |        |        |         |     |          | |
      | |        |        |         |     |          | capture 2nd number
      | |        |        |         |     |          |
      | |        |        |         |     |          chomp leading zeroes
      | |        |        |         |     |
      | |        |        |         |     assert there're 10 digits ahead
      | |        |        |         |
      | |        |        |         assert second part at least 100000000
      | |        |        |
      | |        |        make sure first part at least one nonzero digit
      | |        |
      | |        assert there are 5 chars behind (already tested numeric)
      | |
      | capture 1st number (don't worry; the assertions will fix this up)
      |
      chomp leading zeroes (i'm going to line up these comments damn it!)

これがRubularのデモです。

(?:^|\s)および(?:\s|$)はプレゼンテーションのみを目的としています。)

そしてここに結果があります:

    000010111111111             -->     1       111111111
    116402151672479             -->     11640   2151672479
    006421651672479             -->     642     1651672479
    712120751672479             -->     71212   751672479
    712121551672479             -->     71212   1551672479
    006400351672479             -->     640     351672479

    # not enough digits        
    71212155167247              -->     no match

    # too many digits          
    7121215516724798            -->     no match           

    # first part == 0          
    000001551672479             -->     no match            

    # second part < 100,000,000
    712120098765479             -->     no match
于 2012-09-07T21:21:08.520 に答える
3

私はPythonにあまり詳しくありませんが、以下のソリューション(perl)はあなたが望むことを正確に実行します。醜いですが。

use strict;

my @test = qw/000010111111111 116402151672479 006421651672479 712120751672479 712121551672479 006400351672479/;

foreach(@test){
    /^(?|([1-9]\d{4})|0([1-9]\d{3})|00([1-9]\d{2})|000([1-9]\d)|0000([1-9]))(?|0([1-9]\d{8})|([1-9]\d{9}))/;
    print "$_: ($1, $2)\n";
}

exit 0;

python reページをざっと見てみると、(?|...)明示的にはわかりませんが、あります(?:...)。その場合、一致の配列が得られますが、これには空白以外のエントリが2つしかありません。これが答えになります。

于 2012-09-07T19:03:06.037 に答える
2

このPython正規表現を試してください:

0{0,4}(\d+)(?<=^\d{5})0{0,9}(\d+)
|     |    |          |     |
|     |    |          |     Second number without leading zeros
|     |    |          Up to 9 leading zeros of second number
|     |    Must be preceded by start of string and 5 digits
|     First number without leading zeros
Up to 4 leading zeros of first number
于 2012-09-07T23:37:18.540 に答える
2

これが私の解決策です:

re.search(r'([1-9]\d*)(?=\d{10})0*([1-9]\d*)', "0064000351672479").groups()
# ('640', '351672479')

壊す:

  • ([1-9]\d*)-最初のグループは、1〜9で開始する必要があります。
  • (?=\d{10})-私たちが10のデジタルを持っているという主張を先読みしてください、
  • 0* -2番目の数字からリーダーのゼロをチョップします。
  • ([1-9]\d*)--2番目のグループ(番号)。
于 2012-09-12T07:50:21.403 に答える