2013-01-09 32 views
7

Tôi đang cố gắng tìm cụm từ thông dụng để phân tách một số lớn dựa trên số south asian numbering system.Sử dụng cụm từ thông dụng để phân tách một số lớn trong hệ thống đánh số ở Nam Châu Á

Một vài ví dụ:

  • 1,000,000 (Ả Rập) là 10,00,000 (Ấn Độ/Hindu/Nam Á)
  • 1,000,000,000 (Ả Rập) là 100,00,00,000 (Ấn Độ/H/SA).

Mẫu dấu phẩy lặp lại cho mỗi 7 chữ số. Ví dụ: 1,00,00,000,00,00,000.

Từ cuốn sách Mastering Regular Expressions bởi Friedl, tôi đã biểu thức chính quy sau cho hệ thống đánh số Ả Rập:

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

Đối với hệ thống đánh số Ấn Độ, tôi đã đưa ra biểu thức sau đây nhưng nó không hoạt động đối với các số có nhiều hơn 8 chữ số:

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

Sử dụng mẫu ở trên, tôi nhận được 100000000,00,00,000.

Tôi đang sử dụng mô-đun Python re (re.sub()). Ý tưởng nào?

+0

Tôi nhận thấy rằng các số bạn đang có làm đầu vào không có * bất kỳ dấu phẩy nào trong chúng, phải không? –

+0

Yup, đúng vậy. Hãy để tôi thử giải pháp bạn đã đề xuất dưới đây! – newbie

+0

Cảm ơn bạn đã chỉnh sửa câu hỏi của tôi Ông Pieters. – newbie

Trả lời

6

Hãy thử điều này:

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

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

Là một regex nhận xét:

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

Điều đó đã hiệu quả. Cảm ơn vì sớm phản hồi! – newbie

7

Tôi biết Tim đã trả lời các câu hỏi mà bạn hỏi, nhưng giả sử bạn bắt đầu với số thay vì chuỗi, bạn có cân nhắc xem bạn có cần biểu thức chính quy không? Nếu máy bạn đang sử dụng hỗ trợ một miền địa phương Ấn Độ sau đó bạn chỉ có thể sử dụng các mô-đun ngôn ngữ:

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

Đó phiên dịch viên đã được sao chép từ một hệ thống Ubuntu, nhưng lưu ý rằng các hệ thống Windows có thể không hỗ trợ một miền địa phương phù hợp (ít ít nhất của tôi không), do đó, trong khi điều này là trong một số cách một giải pháp 'sạch', tùy thuộc vào môi trường của bạn nó có thể hoặc có thể không được sử dụng.