Python中含特殊字符的子串检测问题及单位转换需求
搞定带特殊字符的子串检测与单位转换
嘿,我来帮你解决这个问题!你遇到的核心是带特殊Unicode字符(比如Kilómetros里的重音ó)的子串匹配,还有后续的单位提取和转换。其实Python对这类字符支持很好,只要注意几个细节,就能把代码写得既靠谱又健壮。
1. 先解决特殊字符匹配的坑
直接用'Kilómetros' in line其实是可行的,但前提是你读取CSV时用对了编码——一定要指定utf-8编码,不然特殊字符会变成乱码,自然匹配不到。先把读取CSV的代码改对:
import csv # 关键:用utf-8编码读取,避免特殊字符乱码 with open('your_distance_file.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: # 假设距离特征在每行的第一列,先把字符串取出来 distance_text = row[0].strip() # 接下来处理匹配和转换
如果还是担心不同输入的重音变体(比如有的输入是Kilometros不带重音),可以搞个小工具函数把字符串标准化,去掉所有重音符号:
import unicodedata def strip_accents(input_str): # 把Unicode字符分解为基础字符和重音标记,然后过滤掉重音 normalized = unicodedata.normalize('NFD', input_str) return ''.join(c for c in normalized if unicodedata.category(c) != 'Mn') # 测试一下:strip_accents('Kilómetros') → 输出 'Kilometros'
这样不管输入的单位带不带重音,都能统一匹配,容错性更高。
2. 更聪明的单位识别与转换方案
用一堆if判断虽然简单,但如果后面要加更多单位(比如英尺、码),代码会越来越乱。推荐用正则表达式提取数值和单位,再用字典存转换系数,这样扩展性拉满:
import re import unicodedata import csv def strip_accents(input_str): normalized = unicodedata.normalize('NFD', input_str) return ''.join(c for c in normalized if unicodedata.category(c) != 'Mn') # 单位转米的系数表:键是标准化后的单位,值是转换系数 unit_conversion_map = { 'mile': 1609.34, 'miles': 1609.34, 'kilometro': 1000, 'kilometros': 1000, 'metro': 1, 'metros': 1 } with open('your_distance_file.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 如果CSV有表头,先跳过 for row in reader: distance_text = row[0].strip() # 用正则把数值和单位分开:匹配数字(支持小数)和后面的单位 match_result = re.match(r'(\d+\.?\d*)\s*(.*)', distance_text) if match_result: # 提取数值并转成浮点数 raw_value = float(match_result.group(1)) # 提取单位,标准化(去重音+转小写) raw_unit = match_result.group(2).strip() standardized_unit = strip_accents(raw_unit.lower()) # 查转换系数,计算成米 if standardized_unit in unit_conversion_map: meters = raw_value * unit_conversion_map[standardized_unit] print(f"{distance_text} → {meters:.2f} 米") else: print(f"⚠️ 无法识别的单位:{raw_unit}")
3. 为啥这么写更靠谱?
- 正则提取能精准分离数值和单位,就算字符串里有空格或者其他小干扰也不怕
- 单位标准化后,不管是
Kilómetros、kilometro还是METROS都能匹配 - 转换系数用字典管理,后面加新单位只需要在字典里加一行,不用改逻辑代码
举几个实际运行的例子:
输入:12.4 miles → 输出:12.4 miles → 19955.82 米
输入:34 Kilómetros → 输出:34 Kilómetros → 34000.00 米
输入:800 metros → 输出:800 metros → 800.00 米
内容的提问来源于stack exchange,提问作者user1862963
相关产品推荐
相关产品推荐

