Python字符串匹配异常:split_data元素与文本匹配失败求助
问题根源分析
我来帮你拆解下这个问题——你遇到的是典型的「肉眼不可见字符导致字符串不匹配」的情况!核心原因是:split_data[4]表面看起来是'03:31',但实际上包含了额外的隐藏字符(比如单引号、空格),这就导致:
'03:31' in split_data[4]返回True(因为目标字符串确实被包含在里面)'03:31' == split_data[4]返回False(因为两个字符串的整体内容并不完全一致)
具体看你代码里的处理步骤,问题出在这里:
data = cursor.fetchone()得到的是一个元组,假设数据库里的time_arr是逗号分隔的字符串,那么data就是类似("00:00,00:06,00:02,00:08,03:31",)的结构the_new_list = [x.split(',') for x in data]会把这个字符串拆成列表,结果是[['00:00','00:06','00:02','00:08','03:31']](一个嵌套列表)str_data = ''.join(map(str, the_new_list))这一步把嵌套列表转成了字符串,结果会变成"['00:00', '00:06', '00:02', '00:08', '03:31']"——这里额外带上了方括号、单引号和空格!- 之后你用
strip('[]')去掉前后方括号,再split(','),得到的每个元素就会是类似"'00:00'"或者" '03:31'"这样的字符串,自然和纯'03:31'不相等。
解决方案
完全不需要把列表转成字符串再拆分,直接处理数据库返回的原始字符串即可,修改你的read_from_db函数:
import mysql.connector import numpy as np conn=mysql.connector.connect(user="root", password="", host="localhost", database="videojs") def read_from_db(): cursor = conn.cursor() cursor.execute("select time_arr from info where id ='53'") data = cursor.fetchone() # 先处理没有查到数据的边界情况 if not data: print("No matching record found") return # 直接提取time_arr字符串,拆分后去掉每个元素的前后空白(包括空格、换行符等) time_arr_str = data[0] split_data = [item.strip() for item in time_arr_str.split(',')] print(split_data) print(len(split_data)) # 用for循环替代while,代码更简洁易读 for item in split_data: print(item) # 打印item的repr格式,方便排查隐藏字符 print(f"Debug: item content is {repr(item)}") if item in text: print("Matched" ) else: print("not matched" )
额外调试技巧
以后再遇到「看起来一样但不相等」的字符串问题,用repr()打印字符串,它会显示所有肉眼不可见的字符(比如单引号、空格、制表符),比如:
print(repr(split_data[4]))
如果输出是"'03:31'",说明字符串带单引号;如果是"' 03:31'",说明前面有空格,这样就能快速定位问题。
内容的提问来源于stack exchange,提问作者user9191897
相关产品推荐
相关产品推荐

