Uso de expresiones regulares para separar por comas un gran número en el sistema de numeración del sur de Asia

Estoy tratando de encontrar una expresión regular para separar por comas un gran número basado en el sistema de numeración del sur de Asia .

Algunos ejemplos:

  • 1,000,000 (árabe) es 10,00,000 (indio / hindú / sur de Asia)
  • 1,000,000,000 (árabe) es 100,00,00,000 (Indian / H / SA).

El patrón de coma se repite por cada 7 dígitos. Por ejemplo, 1,00,00,000,00,00,000 .

Del libro Mastering Regular Expressions de Friedl, tengo la siguiente expresión regular para el sistema de numeración árabe:

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

Para el sistema de numeración indio, he encontrado la siguiente expresión, pero no funciona con números de más de 8 dígitos:

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

Usando el patrón anterior, obtengo 100000000,00,00,000 .

Estoy usando el módulo re Python ( re.sub() ). ¿Algunas ideas?

Prueba esto:

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

Por ejemplo:

 >>> 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'] 

Como una expresión regular comentada:

 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) 

Sé que Tim ha respondido la pregunta que hiciste, pero suponiendo que comiences con números en lugar de cadenas, ¿has considerado si necesitas una expresión regular? Si la máquina que está utilizando es compatible con una configuración regional india, entonces podría usar el módulo de configuración regional:

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

Esa sesión de intérprete se copió de un sistema Ubuntu, pero tenga en cuenta que los sistemas Windows pueden no admitir un entorno local adecuado (al menos el mío no lo hace), por lo que si bien esto es de alguna manera una solución “más limpia”, dependiendo de su entorno, puede o no puede ser utilizable.