python 中英文字符,文本换行问题,求指导

utf-8编码 英文字符字节数为1 中文为3 一行最多填37个中文字符且字节数为37*3为111,如果存在英文字符,就填不满37个中文字符的位置,就需要从下一行的字符加到英文字符这一行。也就是字节数在106-108的字节数需要加一个从下一行加一个中文。 我这个写法有问题,当第一行满足111 第二行不满足,我这个写法就把列表第一行 和第二行都加上字符了。需要怎么修改9-11行的代码.

obj=<span class="hljs-string">"警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会自动运行。"</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">cut</span>(<span class="hljs-params">obj, sec</span>):
        str_list = [obj[i:i + sec] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(obj), sec)]
        <span class="hljs-keyword">for</span> w <span class="hljs-keyword">in</span> str_list:
            <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(w.encode(<span class="hljs-string">"utf-8"</span>))>=<span class="hljs-number">108</span>:
                <span class="hljs-keyword">pass</span>
            <span class="hljs-keyword">elif</span> <span class="hljs-built_in">len</span>(w.encode(<span class="hljs-string">"utf-8"</span>))<=107<span class="hljs-keyword">and</span> <span class="hljs-built_in">len</span>(w.encode(<span class="hljs-string">"utf-8"</span>))><span class="hljs-number">104</span>:
                    sec+=<span class="hljs-number">1</span>
                    str_list = [obj[i:i + sec] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(obj), sec)]
                    <span class="hljs-keyword">return</span> str_list
        
            <span class="hljs-keyword">else</span>:
                <span class="hljs-keyword">pass</span>
c=cut(obj,<span class="hljs-number">37</span>)
<span class="hljs-built_in">print</span>(c)

要的效果是: ['警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可','能结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会','自动运行。'] 而我的是:['警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能', '结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会自', '动运行。'] 两行都加了有问题。

import re
obj="警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会自动运行。"

def re_cut(obj,sec):
    r = []
    s = obj.encode('utf8')
    while len(s) > 0:
        length = sec * 3
        if len(s)<length:
            r.append(s.decode('utf8'))
            break;
        t = str(s[:length])
        m = re.findall(r'(?:\\x[8-9a-f][0-9a-f]){1,3}|[\u0020-\u007f]',t,re.I)
        last = re.findall(r'\\x[8-9a-f][0-9a-f]',m[-2],re.I)
        #length -= len(last) % 3
        length += 3 - len(last)
        r.append(s[:length].decode('utf8'))
        s = s[length:]
    return r

d=re_cut(obj,37)
print(d,[len(n.encode('utf8')) for n in d])

# 先用正则帮你实现以下

根据需要,自己选择是 length+=还是-=的行

['警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可', '能结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会', '自动运行。'] [109, 110, 15]

['警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能', '结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会自动', '运行。'] [112, 113, 9]

 

import re
obj = "警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能结冰,此时应保证热水器处于通电状态(可以不打开热水器开关),发热体组件将会自动运行。"
#obj = "警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能结冰,此时应保证热水器处于开机通气状态,防冻功能将会自动运行。"
#obj='使用中请勿外出或就寝,使用后关闭开关旋钮及燃气总阀门,入睡或外出前重复检查是否切实关好。'
def cut(obj, sec):
    str_list = [obj[i:i + sec] for i in range(0, len(obj), sec)]
    new=[]
    for i in range(len(str_list)):
        if len(str_list[i].encode("utf-8")) >= 108:
            new.append(str_list[i])
        else:
            if re.findall('[^\u4e00-\u9fa5,。]+', str_list[i]):
                str_list[i]+= str_list[i+1][0]
                new.append(str_list[i])
            else:
                str_list[i] = str_list[i][i-1:]
                new.append(str_list[i])
                
    return new
c=cut(obj,37)
print(c)

 

您好,非常感谢,但是我测试了一下,换了其他的句子。

第一个句子:警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可能结冰,此时应保证热水器处于开机通气状态,防冻功能将会自动运行。

结果:['警告:当环境温度可能低于0℃时,若未对热水器进行排水操作,那么热水器内部可', '结冰,此时应保证热水器处于开机通气状态,防冻功能将会自动运行。'] 第二行的“能”字没了

第二个句子:’使用中请勿外出或就寝,使用后关闭开关旋钮及燃气总阀门,入睡或外出前重复检查是否切实关好。’

结果:

['使用中请勿外出或就寝,使用后关闭开关旋钮及燃气总阀门,入睡或外出前重复检查', '否切实关好。']

第二行的“是”字没了。 

能在修改一下吗。