示例:12345678 => 12,345,678
分析:
自右向左,每三位增加一个逗号。
表达式:/(?=(a{3})+($))/g
(不完美)
(?=..)
正向零度断言,表示匹配该子表达式前面的项。(\d{3})+
表示匹配3个数字视为一个分组。
+表示整数倍(匹配连续3个数字、6个数字、9个数字…)$
表示每一次都匹配到行尾,以防止被匹配过的项再次被匹配。
测试:有Bug,对于3整数长度的数字,头部也会匹配到。
法一:表达式 /(?!^)(?=(\d{3})+$)/g
(推荐)
优化:过滤头部。添加 (?!^)
正向否定零度断言。表示不匹配 ^
(行首)。
测试:完美替换。
python代码:
# coding=utf8
# 上述标签定义了本文档的编码,与Python 2.x兼容。
import re
regex = r"(?!^)(?=(\d{3})+$)"
test_str = ("12345678\n"
"123456789\n"
"1234567895642342\n"
"324252353262363")
subst = ","
# 您可以通过改变第4个参数来手动指定替换的数量
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print (result)
法二:/(\d)(?=(\d{3})+$)/g
优化:选择匹配前一个数字。只有当该数字后面有n对3个数字时才匹配。
只不过,当前表达式匹配到的项是原本字符串中就存在的,不能单纯的替换。需要在原本的匹配项上追加,
字符。
测试:完美替换。
python代码:
# coding=utf8
# 上述标签定义了本文档的编码,与Python 2.x兼容。
import re
regex = r"(\d)(?=(\d{3})+$)"
test_str = ("12345678\n"
"123456789\n"
"1234567895642342\n"
"324252353262363")
subst = "$1,"
# 您可以通过改变第4个参数来手动指定替换的数量
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print (result)