html.parser.unescape返回特殊编码字符串导致split('-')分割失败问题
问题根因
该问题的核心根因为特殊Unicode字符和普通ASCII字符的视觉混淆,解码后的内容里两个关键字符和常规认知的ASCII字符并不一致:
解码后是不换行空格\xa0(Unicode U+00A0),区别于普通ASCII空格(U+0020)–解码后是短破折号–(Unicode U+2013),区别于普通ASCII连字符/减号-(U+002D)
调用split('-')时传入的是普通ASCII连字符,无法匹配解码后的短破折号,因此无法完成分割操作。
解决方案
方案1:直接匹配对应字符分割
如果确认源内容里的分隔符固定是–解码后的U+2013短破折号,直接用该字符作为分割参数即可:
import html.parser raw_str = '10:20am – 12:10pm' decoded_str = html.parser.unescape(raw_str) # 直接用U+2013短破折号分割,写为split('\u2013')效果完全一致 res = decoded_str.split('–') # 去除结果前后的不换行空格 res = [item.strip() for item in res] print(res) # 输出:['10:20am', '12:10pm']
方案2:统一归一化特殊字符再处理
如果后续还要做更多字符串操作,建议先把所有特殊Unicode字符替换为对应的ASCII等价字符,避免后续再出现同类问题:
import html.parser raw_str = '10:20am – 12:10pm' decoded_str = html.parser.unescape(raw_str) # 字符归一化处理 normalized_str = decoded_str.replace('\u2013', '-') # 短破折号替换为普通连字符 normalized_str = normalized_str.replace('\xa0', ' ') # 不换行空格替换为普通空格 # 此时即可用普通连字符正常分割 res = normalized_str.split('-') print(res) # 输出:['10:20am ', ' 12:10pm']
方案3:正则匹配所有类破折号字符分割
如果源内容可能出现多种破折号(长破折号U+2014、半角破折号、连字符等),可以用正则匹配所有类破折号的字符做分割,兼容性更强:
import html.parser import re raw_str = '10:20am – 12:10pm' decoded_str = html.parser.unescape(raw_str) # 匹配所有常见破折号、连字符完成分割 res = re.split(r'[\u2010-\u2015-]', decoded_str) res = [item.strip() for item in res] print(res) # 输出:['10:20am', '12:10pm']
内容的提问来源于stack exchange,提问作者Caleb Marcum
相关产品推荐
相关产品推荐

