如何使用正则表达式查找DataFrame中特殊字符所在行号
问题说明
待处理的iris数据集中混入了?、@类特殊字符,需要定位特殊字符所在的具体行号,原有实现re.findall('?',str(data))无法得到正确结果。
原有代码问题
- 正则语法错误:
?是正则的元字符,代表匹配前序内容0次或1次,直接传入'?'作为正则规则属于语法错误,无法匹配字面意义的问号字符。 - 匹配逻辑错误:直接将整个数据集对象转为字符串做全局匹配,即使正则规则正确,也只能得到匹配到的字符数量,无法关联到具体行号,且会把数据集对象的打印格式、索引标记等无关内容纳入匹配范围,结果不准。
正确实现方案
根据你读取数据集的方式选择对应代码即可:
基于pandas处理DataFrame格式数据集(最常用)
import pandas as pd import re # 替换为你的数据集实际路径 df = pd.read_csv("iris_with_special_chars.csv") # 正则规则,匹配?或@,特殊元字符需要加\转义 match_pattern = re.compile(r'[?@]') result_rows = [] for idx, row in df.iterrows(): # 将当前行所有单元格内容拼接为字符串做匹配 row_text = "".join(str(cell) for cell in row.values) if match_pattern.search(row_text): # 若需要0起始索引直接存idx,需要和日常表格对齐的1起始行号就存idx+1 result_rows.append(idx + 1) print("包含特殊字符的行号(1起始):", result_rows)
如果不想用正则,直接用字符串成员判断也可以,逻辑更直观:
import pandas as pd df = pd.read_csv("iris_with_special_chars.csv") special_chars = {"?", "@"} result_rows = [] for idx, row in df.iterrows(): row_text = "".join(str(cell) for cell in row.values) if any(char in row_text for char in special_chars): result_rows.append(idx + 1) print("包含特殊字符的行号(1起始):", result_rows)
基于原生Python直接读取csv文件
import re match_pattern = re.compile(r'[?@]') result_rows = [] # 替换为你的数据集实际路径 with open("iris_with_special_chars.csv", "r", encoding="utf-8") as f: # 若不需要统计表头行,可以先执行next(f)再开始计数 for line_num, line in enumerate(f, start=1): if match_pattern.search(line): result_rows.append(line_num) print("包含特殊字符的行号:", result_rows)
补充说明
- 正则中需要匹配
?、*、+、.这类自带特殊含义的字符字面量时,要在字符前加\做转义,避免被解析为正则规则语法。 - 如果需要查找更多特殊字符,直接在正则的字符集
[]里追加,或者在special_chars集合里添加对应字符即可。
内容的提问来源于stack exchange,提问作者Suraj Janampally
相关产品推荐
相关产品推荐

