南亚数字系统中用正则表达式逗号分隔大数

2024-06-01 01:53:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个正则表达式,以逗号分隔基于south asian numbering system的大数。在

几个例子:

  • 1,000,000(阿拉伯语)是{}(印度/印度/南亚)
  • 1,000,000,000(阿拉伯语)是{}(印度语/H/SA)。在

逗号模式每7位重复一次。例如, 1,00,00,000,00,00,000。在

从Friedl的《掌握正则表达式》(Mastering Regular Expressions)一书中,我有以下阿拉伯语编号系统的正则表达式:

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

对于印度数字系统,我提出了以下表达式,但它不适用于超过8位数的数字:

^{pr2}$

使用上面的模式,我得到100000000,00,00,000。在

我使用的是Pythonre模块(re.sub())。有什么想法吗?在


Tags: 系统sa模式数字systemexpressions例子逗号
2条回答

我知道Tim已经回答了您提出的问题,但是假设您从数字而不是字符串开始,您是否考虑过是否需要正则表达式?如果您使用的机器支持印度语言环境,那么您可以使用语言环境模块:

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

解释器会话是从Ubuntu系统复制的,但是要知道Windows系统可能不支持合适的语言环境(至少我的系统不支持),所以虽然这在某种程度上是一个“更干净”的解决方案,但它可能是可用的,也可能是不可用的。在

试试这个:

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

例如:

^{pr2}$

作为一个评论的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)

相关问题 更多 >