如何在Python代码中实现re.sub()替换成功时的分支执行逻辑
如何在Python代码中实现「当re.sub()成功执行替换时进入对应代码块,否则进入其他代码块」的逻辑?
示例输入字符串
import re input_text = "Hello, I will dictate the following numbers in Spanish, write them down ochocientos veinti-ocho sete cientos quince dieci siete dieci-seis,ochocientos veinti ocho"
三个替换函数(含伪代码条件)
hundreds_replacement函数
def hundreds_replacement(input_text, hundreds_colloquial_list_b, hundreds_numbers_list_b, hundreds_numbers_list_a2, hundreds_numbers_list_a1): # 当百位后存在十位和个位数字时:--> {2到9}XX for nro in range(len(hundreds_colloquial_list_b)): input_text = re.sub(hundreds_colloquial_list_b[nro].replace(" ", r"[\s|-|]"), hundreds_numbers_list_b[nro], input_text) # 处理十位 input_text = tens_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 处理个位 input_text = unit_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 当百位后无十位数字时:--> {2到9}0X for nro in range(len(hundreds_colloquial_list_b)): input_text = re.sub(hundreds_colloquial_list_b[nro].replace(" ", r"[\s|-|]"), hundreds_numbers_list_a1[nro], input_text) # 处理个位 input_text = unit_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 当百位后无十位和个位数字时:--> {2到9}00 for nro in range(len(hundreds_colloquial_list_b)): input_text = re.sub(hundreds_colloquial_list_b[nro].replace(" ", r"[\s|-|]"), hundreds_numbers_list_a2[nro], input_text) # 当"ciento"后存在十位和个位数字时:--> 1XX for nro in range(len(r"ciento[\s|-|]")): input_text = re.sub(r"ciento[\s|-|]", "1", input_text) # 处理十位 input_text = tens_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 处理个位 input_text = unit_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 当"ciento"后无十位数字时:--> 10X for nro in range(len(hundreds_colloquial_list_b)): input_text = re.sub(hundreds_colloquial_list_b[nro].replace(" ", r"[\s|-|]"), hundreds_numbers_list_a1[nro], input_text) # 处理个位 input_text = unit_replacement(input_text, unit_colloquial_list, unit_numbers_list) # 当无十位和个位数字时:--> 100 for nro in range(len(r"cien")): input_text = re.sub(r"cien", "100", input_text) return input_text
tens_replacement函数
def tens_replacement(input_text, tens_colloquial_list_b, tens_numbers_list_b, tens_colloquial_list_a, tens_numbers_list_a): for nro in range(len(tens_colloquial_list_b)): input_text = re.sub(tens_colloquial_list_b[nro].replace(" ", r"[\s|-|]"), tens_numbers_list_b[nro], input_text) # 若替换成功: input_text = unit_replacement(input_text) # 若替换失败: for nro in range(len(tens_colloquial_list_a)): input_text = re.sub(tens_colloquial_list_a[nro].replace(" ", r"[\s|-|]"), tens_numbers_list_a[nro], input_text) return input_text
unit_replacement函数
def unit_replacement(input_text, unit_colloquial_list, unit_numbers_list): # 个位:十进制的10个数字符号 for nro in range(len(unit_colloquial_list)): input_text = re.sub(unit_colloquial_list[nro], unit_numbers_list[nro], input_text) return input_text
替换所需的匹配与数字映射列表
hundreds_colloquial_list = ["novescientos", "nove cientos", "ochoscientos", "ocho cientos", "setescientos", "sete cientos", "seis cientos", "quinientos", "cuatros cientos", "cuatro cientos", "trecientos", "tres cientos", "docientos", "dos cientos", "novescientas", "nove cientas", "ochoscientas", "ocho cientas", "setescientas", "sete cientas", "seis cientas", "quinientas", "cuatros cientas", "cuatro cientas", "trecientas", "tres cientas", "docientas", "dos cientas"] hundreds_numbers_list_a2 = ["900", "900", "800", "800", "700", "700", "600", "500", "400", "400", "300", "300", "200", "200", "900", "900", "800", "800", "700", "700", "600", "500", "400", "400", "300", "300", "200", "200"] hundreds_numbers_list_a1 = ["90" , "90" , "80" , "80" , "70" , "70" , "60" , "50" , "40" , "40" , "30" , "30" , "20" , "20" , "90" , "90" , "80" , "80" , "70" , "70" , "60" , "50" , "40" , "40" , "30" , "30" , "20" , "20" ] hundreds_numbers_list_b = ["9" , "9" , "8" , "8" , "7" , "7" , "6" , "5" , "4" , "4" , "3" , "3" , "2" , "2" , "9" , "9" , "8" , "8" , "7" , "7" , "6" , "5" , "4" , "4" , "3" , "3" , "2" , "2" ] tens_colloquial_list_a = ["noventa", "ochenta", "setenta", "sesenta", "cincuenta", "cuarenta", "treinta", "veinte", "dieci nueve", "dieci ocho", "dieci siete", "dieci seis", "quince", "catorse", "trece", "doce", "once", "diez"] tens_numbers_list_a = ["90", "80", "70", "60", "50", "40", "30", "20", "19", "18", "17", "16", "15", "14", "13", "12", "11", "10"] tens_colloquial_list_b = ["noventa y", "ochenta y", "setenta y", "sesenta y", "cincuenta y", "cuarenta y", "treinta y", "veinti "] tens_numbers_list_b = ["9", "8", "7", "6", "5", "4", "3", "2"] unit_colloquial_list = ["nueve", "ocho", "siete", "seis", "cinco", "cuatro", "tres", "dos", "una", "uno", "un", "cero"] unit_numbers_list = ["9", "8", "7", "6", "5", "4", "3", "2", "1", "1", "1", "0"]
函数调用代码
# 处理百位 input_text = hundreds_replacement(input_text, hundreds_colloquial_list, hundreds_numbers_list_b, hundreds_numbers_list_a2, hundreds_numbers_list_a1) # 处理十位 input_text = tens_replacement(input_text, tens_colloquial_list_b, tens_numbers_list_b, tens_colloquial_list_a, tens_numbers_list_a) # 处理个位(仅当之前未匹配到十位或百位相关模式时执行) input_text = unit_replacement(input_text, unit_colloquial_list, unit_numbers_list) print(repr(input_text)) # 打印输出
预期正确输出
"Hello, I will dictate the following numbers in Spanish, write them down 828 715 17 16,828"
注:代码已尽可能简化(原代码包含千位和百万位转换逻辑),for循环通过索引同步遍历列表,确保数字名称与对应符号在同一迭代中处理。
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

