Cool_Breeze 发表于 2020-7-15 17:18:10

Python把中文数字替换成阿拉伯数字

本帖最后由 Cool_Breeze 于 2020-7-17 21:41 编辑

更新了! 你们在测试一下看看还有没有bug!
#coding=utf-8
#By Gin
#2020/7/17
#Rev 02

import os
import re

ch_dict = {u'零':0, u'一':1, u'二':2, u'三':3, u'四':4,
      u'五':5, u'六':6, u'七':7, u'八':8, u'九':9,u'十':10,
      u'百':100, u'千':10 ** 3, u'万':10 ** 4,u'〇':0,
      u'壹':1, u'贰':2, u'叁':3, u'肆':4,u'伍':5,
      u'陆':6, u'柒':7, u'捌':8, u'玖':9,u'拾':10,
      u'佰':100, u'仟':10 ** 3, u'萬':10 ** 4,u'亿':10 ** 8, u'億':10 ** 8,
      u'幺': 1,u'两':2,
      u'0':0, u'1':1, u'2':2, u'3':3, u'4':4,
      u'5':5, u'6':6, u'7':7, u'8':8, u'9':9}

def converion(temp, unit):
    intr = 0
    #print(temp, unit)
    temp_len = len(temp)
    if temp_len <= 2 and temp == 10: #十到十九需要单独转换
      for i in temp:
            intr += i
      return intr * unit
    for i in range(temp_len):
      if temp > 9 and temp != 0:
            intr += temp * temp
    if temp[-1] < 10: intr += temp[-1]
    return intr * unit

def split_unit(temp, unit):
    nu = []
    while True:
      if temp != unit:
            nu.append(temp.pop(0))
            continue
      temp.pop(0)
      return converion(nu, unit)

def onere(strarr):
    #一一四 ===>>> 114
    #四百三十六 ===>>> 436
    res = ''
    intr = 0
    com = re.compile('[十百千万]')
    if re.findall(com, strarr):
      temp = for i in strarr] #列表666
      if 10**8 in temp:
            intr += split_unit(temp, 10**8)

      if 10**4 in temp:
            intr += split_unit(temp, 10**4)
      if temp:
            intr += converion([ i for i in temp], 1)
      return str(intr)
    else:
      for i in strarr:
            res += str(ch_dict)
    return res

ch_key = ''.join(ch_dict.keys())
com = re.compile('第([' + ch_key + ']{1,20})[章|节]')
file = [] #文件列表

print('更改章节名中的中文数字为阿拉伯数字!')

while True:
    try:
      # pa = input('请输入路径:')
      pa = r'D:\GIN\py\novel\biquge'
      os.chdir(pa)
      print('当前工作路径为:{}'.format(os.getcwd()))
      break
    except BaseException as err:
      print(err)
      continue

for i,j,k in os.walk(pa):
    file = k
    j.clear()

for i in file:
    res = re.findall(com,i)
    if res != [''] and res:
      news = i.replace(*res, onere(*res))
      print('{:<30}\n{:<30}\n'.format(i, news))
      # os.rename(i, news)
更改章节名中的中文数字为阿拉伯数字!
当前工作路径为:D:\GIN\py\novel\biquge
第一万亿两千三百六十五万三千六百二十八章.txt
第1000023653628章.txt

第一亿一千一百二十三万四千五百六十七章 - 副本.txt
第111234567章 - 副本.txt

第一千一百二十三万四千五百六十七章 - 副本 (9).txt
第11234567章 - 副本 (9).txt

第一千二百零三章 - 副本 (5).txt
第1203章 - 副本 (5).txt

第一百二十三万四千五百六十七章 - 副本 (8).txt
第1234567章 - 副本 (8).txt

第一百二十三章 - 副本 (4).txt
第123章 - 副本 (4).txt

第一百零二亿五千零一万零一千零三十八章 - 副本 - 副本.txt
第10250011038章 - 副本 - 副本.txt

第八章 - 副本 (3).txt
第8章 - 副本 (3).txt

第十一章 - 副本 (2).txt
第11章 - 副本 (2).txt

第十万零三千六百零九章 - 副本 (7).txt
第103609章 - 副本 (7).txt


请按任意键继续. . .

Ray-先生 发表于 2020-7-16 15:33:53

沙发

nahongyan1997 发表于 2020-7-17 14:23:18

转换的准吗
比如一万亿两千三百六十五万三千六百二十八

Cool_Breeze 发表于 2020-7-17 16:36:40

本帖最后由 Cool_Breeze 于 2020-7-17 16:38 编辑

nahongyan1997 发表于 2020-7-17 14:23
转换的准吗
比如一万亿两千三百六十五万三千六百二十八

不能,还需要改进,现在只能转换10w以内的

nahongyan1997 发表于 2020-7-17 16:52:02

好的

nahongyan1997 发表于 2020-7-17 16:52:59

这个可以咱俩一起研究,我想弄个闹钟的程序需要这个转换,虽然没有那么大的数但是还是有必要精确的

hrp 发表于 2020-7-17 17:23:31

顶一下

Cool_Breeze 发表于 2020-7-17 20:02:57

没有学过数据分析,很是麻烦,大家给点意见吧!

Cool_Breeze 发表于 2020-7-17 21:22:24

nahongyan1997 发表于 2020-7-17 16:52
这个可以咱俩一起研究,我想弄个闹钟的程序需要这个转换,虽然没有那么大的数但是还是有必要精确的

更新了!你去试试!

Cool_Breeze 发表于 2020-7-18 21:32:56

本帖最后由 Cool_Breeze 于 2020-7-20 10:53 编辑

单一#coding=utf-8
#By Gin
#2020/7/17
#Rev 02

ch_dict = {u'零':0, u'一':1, u'二':2, u'三':3, u'四':4,
      u'五':5, u'六':6, u'七':7, u'八':8, u'九':9,u'十':10,
      u'百':100, u'千':10 ** 3, u'万':10 ** 4,u'〇':0,
      u'壹':1, u'贰':2, u'叁':3, u'肆':4,u'伍':5,
      u'陆':6, u'柒':7, u'捌':8, u'玖':9,u'拾':10,
      u'佰':100, u'仟':10 ** 3, u'萬':10 ** 4,u'亿':10 ** 8, u'億':10 ** 8,
      u'幺': 1,u'两':2}

def converion(temp, unit):
    intr = 0
    # print(temp, unit)
    temp_len = len(temp)
    if temp_len <= 2 and temp == 10: #十到十九需要单独转换
      for i in temp:
            intr += i
      return intr * unit
    for i in range(temp_len):
      if temp > 9 and temp != 0:
            intr += temp * temp
    if temp[-1] < 10: intr += temp[-1]
    return intr * unit

def split_unit(temp, unit):
    nu = []
    while True:
      if temp != unit:
            nu.append(temp.pop(0))
            continue
      temp.pop(0)
      return converion(nu, unit)

def onere(strarr):
    intr = 0
    temp = for i in strarr] #列表666
    if 10**8 in temp:
      intr += split_unit(temp, 10**8)
    if 10**4 in temp:
      intr += split_unit(temp, 10**4)
    if temp:
      intr += converion(temp, 1)
    return str(intr)

test_dig = [u'九',
                u'十一',
                u'一百二十三',
                u'一千二百零三',
                u'一万一千一百零一',
                u'十万零三千六百零九',
                u'一百二十三万四千五百六十七',
                u'一千一百二十三万四千五百六十七',
                u'一亿一千一百二十三万四千五百六十七',
                u'一百零二亿五千零一万零一千零三十八',
                u'一千一百一十一亿一千一百二十三万四千五百六十七',
                ]
               
for i in test_dig:
    print(i,'\n',onere(i))

9
十一
11
一百二十三
123
一千二百零三
1203
一万一千一百零一
11101
十万零三千六百零九
103609
一百二十三万四千五百六十七
1234567
一千一百二十三万四千五百六十七
11234567
一亿一千一百二十三万四千五百六十七
111234567
一百零二亿五千零一万零一千零三十八
10250011038
一千一百一十一亿一千一百二十三万四千五百六十七
111111234567

请按任意键继续. . .

nahongyan1997 发表于 2020-7-20 17:42:31

u'一亿亿 '

10000000100000000

发现BUG!

nahongyan1997 发表于 2020-7-20 17:43:50

本帖最后由 nahongyan1997 于 2020-7-20 17:45 编辑

有些数字单位叠加要做乘算还要考虑是不是在4的倍数位上。

Cool_Breeze 发表于 2020-7-21 12:03:41

nahongyan1997 发表于 2020-7-20 17:43
有些数字单位叠加要做乘算还要考虑是不是在4的倍数位上。

的确!
页: [1]
查看完整版本: Python把中文数字替换成阿拉伯数字