7

南アジアの番号付けシステムに基づいて、大きな数をコンマで区切るための正規表現を見つけようとしています。

いくつかの例:

  • 1,000,000(アラビア語) は10,00,000(インド/ヒンズー/南アジア)
  • 1,000,000,000(アラビア語) は100,00,00,000(インド/H/SA) です。

カンマ パターンは 7 桁ごとに繰り返されます。たとえば、 1,00,00,000,00,00,000.

Friedl による本 Mastering Regular Expressions から、アラビア語の番号付けシステムの次の正規表現があります。

r'(?<=\d)(?=(\d{3})+(?!\d))'

インドの番号付けシステムについては、次の式を思いつきましたが、8 桁を超える数字では機能しません。

r'(?<=\d)(?=(((\d{2}){0,2}\d{3})(?=\b)))'

上記のパターンを使用すると、100000000,00,00,000.

Pythonreモジュール ( re.sub()) を使用しています。何か案は?

4

2 に答える 2

7

Tim があなたの質問に答えたことは知っていますが、文字列ではなく数字から始めると仮定すると、正規表現が必要かどうかを検討したことはありますか? 使用しているマシンがインドのロケールをサポートしている場合は、locale モジュールを使用できます。

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, "en_IN")
'en_IN'
>>> locale.format("%d", 10000000, grouping=True)
'1,00,00,000'

そのインタープリター セッションは Ubuntu システムからコピーされましたが、Windows システムは適切なロケールをサポートしていない可能性があることに注意してください (少なくとも私のものはサポートしていません)。または使用できない場合があります。

于 2013-01-09T15:08:23.577 に答える
6

これを試して:

(?<=\d)(?=(\d{2}){0,2}\d{3}(\d{7})*(?!\d))

例えば:

>>> import re
>>> inp = ["1" + "0"*i for i in range(20)]
>>> [re.sub(r"(?<=\d)(?=(\d{2}){0,2}\d{3}(\d{7})*(?!\d))", ",", i) 
     for i in inp]
['1', '10', '100', '1,000', '10,000', '1,00,000', '10,00,000', '1,00,00,000', 
 '10,00,00,000', '100,00,00,000', '1,000,00,00,000', '10,000,00,00,000', 
 '1,00,000,00,00,000', '10,00,000,00,00,000', '1,00,00,000,00,00,000', 
 '10,00,00,000,00,00,000', '100,00,00,000,00,00,000', 
 '1,000,00,00,000,00,00,000', '10,000,00,00,000,00,00,000',
 '1,00,000,00,00,000,00,00,000']

コメントされた正規表現として:

result = re.sub(
    r"""(?x)       # Enable verbose mode (comments)
    (?<=\d)        # Assert that we're not at the start of the number.
    (?=            # Assert that it's possible to match:
     (\d{2}){0,2}  # 0, 2 or 4 digits,
     \d{3}         # followed by 3 digits,
     (\d{7})*      # followed by 0, 7, 14, 21 ... digits,
     (?!\d)        # and no more digits after that.
    )              # End of lookahead assertion.""", 
    ",", subject)
于 2013-01-09T14:34:51.760 に答える