2013-01-09 5 views
7

Próbuję znaleźć wyrażenie regularne dla przecinka, oddzielając dużą liczbę na podstawie south asian numbering system.Używanie wyrażenia regularnego do rozdzielania przecinków dużej liczby w południowo azjatyckim systemie numerowania

Kilka przykładów:

  • 1,000,000 (arabski) jest 10,00,000 (Indian/Hindus/Azji Południowej)
  • 1,000,000,000 (arabski) jest 100,00,00,000 (Indian/H/SA).

Wzór przecinka jest powtarzany co 7 cyfr. Na przykład: 1,00,00,000,00,00,000.

Z książki Mastering wyrażenia regularne przez Friedl, Mam następujące wyrażenie regularne dla arabskiego systemu numeracji:

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

Dla cyfry indyjskie, mam wymyślić następującego wyrażenia, ale to nie działa dla liczb z więcej niż 8 cyfr:

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

Stosując powyższy wzór, mam 100000000,00,00,000.

Używam modułu Python re (re.sub()). Jakieś pomysły?

+0

Uważam, że liczby, które wprowadzasz, nie zawierają jeszcze * żadnych * przecinków, prawda? –

+0

Tak, zgadza się. Pozwól mi wypróbować rozwiązanie, które zaproponowałeś poniżej! – newbie

+0

Dziękuję za zredagowanie mojego pytania, panie Pieters. – newbie

Odpowiedz

6

Spróbuj tego:

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

Na przykład:

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

Jako skomentował regex:

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) 
+0

To działało. Dzięki za szybką odpowiedź! – newbie

7

wiem Tim odpowiedział na pytanie prosiłeś, ale zakładając, że zaczynają z liczbami zamiast łańcuchów, czy zastanawiałeś się, czy potrzebujesz w ogóle wyrażenia regularnego? Jeżeli urządzenie używasz obsługiwany indyjską locale wtedy można po prostu użyć modułu lokalizacji:

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

tej sesji interpreter został skopiowany z systemu Ubuntu, ale należy pamiętać, że systemy Windows mogą nie obsługiwać odpowiedniego lokum (w najmniej moje nie), chociaż jest to w pewnym sensie "czystsze" rozwiązanie, w zależności od środowiska, które może być lub może nie być użyteczne.

Powiązane problemy