将Pandas DataFrame保存为CSV时触发're.error: multiple repeat at position 2'错误的求助
将Pandas DataFrame保存为CSV时触发're.error: multiple repeat at position 2'错误的求助
问题描述
以下是我编写的代码,它在处理database字典里的ai: df_ai时出现了错误:
import pandas as pd # 补充原代码遗漏的导入 data = pd.read_csv('survey_results_public.csv') df_demographics = data[['ResponseId', 'MainBranch', 'Age', 'Employment', 'EdLevel', 'YearsCode', 'Country']] df_learn_code = data[['ResponseId', 'LearnCode']] df_language = data[['ResponseId', 'LanguageAdmired']] df_ai = data[['ResponseId', 'AISelect', 'AISent', 'AIAcc', 'AIComplex', 'AIThreat', 'AIBen', 'AIToolCurrently Using']] database = {'demographics': df_demographics, 'learn_code': df_learn_code, 'language': df_language, 'ai': df_ai} def find_semicolons(dataframe): result = [] firstFifty = dataframe.head(50) for column in firstFifty.columns: if firstFifty[column].apply(lambda x: ';' in str(x)).any(): result.append(column) return result def transform_dataframe(dataframe): result = find_semicolons(dataframe) for column in result: values = [str(x).split(';') for x in dataframe[column].unique().tolist()] flat_values = [] for x in values: flat_values.extend(x) flat_values = set(flat_values) for x in flat_values: dataframe[x] = dataframe[column].str.contains(x, na=False).astype(int) for x in database: transform_dataframe(database.get(x)) database.get(x).to_csv(x + '.csv')
报错信息
Traceback (most recent call last): File "/Users/shalim/PycharmProjects/work/stackoverflow.py", line 45, in <module> transform_dataframe(database.get(x)) File "/Users/shalim/PycharmProjects/work/stackoverflow.py", line 40, in transform_dataframe dataframe[x] = dataframe[column].str.contains(x, na=False).astype(int) File "/Users/shalim/PycharmProjects/work/venv/lib/python3.9/site-packages/pandas/core/strings/accessor.py", line 137, in wrapper return func(self, *args, **kwargs) File "/Users/shalim/PycharmProjects/work/venv/lib/python3.9/site-packages/pandas/core/strings/accessor.py", line 1327, in contains if regex and re.compile(pat).groups: File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/re.py", line 252, in compile return _compile(pattern, flags) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/re.py", line 304, in _compile p = sre_compile.compile(pattern, flags) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/sre_compile.py", line 764, in compile p = sre_parse.parse(p, flags) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/sre_parse.py", line 948, in parse p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/sre_parse.py", line 443, in _parse_sub itemsappend(_parse(source, state, verbose, nested + 1, File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/sre_parse.py", line 671, in _parse raise source.error("multiple repeat", re.error: multiple repeat at position 2
问题分析与解决方案
嘿,这个问题我熟!核心原因很明确:Pandas的str.contains()默认会把搜索字符串当作正则表达式解析,而你的AI相关数据里肯定存在正则特殊字符(比如+、*这类重复量词,比如某个AI工具名称可能是GPT-4+,里面的+就是正则里的重复符号)。当str.contains()尝试把这些字符当作正则语法解析时,就会因为语法错误抛出re.error: multiple repeat。
关键修改
你只需要在transform_dataframe函数里的str.contains()调用中添加regex=False参数,强制它按字面文本匹配,而不是正则表达式:
修改这一行:
dataframe[x] = dataframe[column].str.contains(x, na=False).astype(int)
为:
dataframe[x] = dataframe[column].str.contains(x, na=False, regex=False).astype(int)
额外优化建议
另外,我注意到你在find_semicolons函数里只检查了前50行数据是否有分号,这可能会漏过后面行中包含分号的列。如果你的数据存在这种情况,建议去掉head(50)的限制,直接用整个DataFrame来检查:
def find_semicolons(dataframe): result = [] # 去掉head(50),检查所有行的分号情况 for column in dataframe.columns: if dataframe[column].apply(lambda x: ';' in str(x)).any(): result.append(column) return result
修改后的完整transform_dataframe函数
def transform_dataframe(dataframe): result = find_semicolons(dataframe) for column in result: values = [str(x).split(';') for x in dataframe[column].unique().tolist()] flat_values = [] for x in values: flat_values.extend(x) flat_values = set(flat_values) for x in flat_values: # 新增regex=False参数,避免正则解析错误 dataframe[x] = dataframe[column].str.contains(x, na=False, regex=False).astype(int)
这样修改后,你的代码就能顺利处理所有DataFrame包括ai对应的df_ai了,不会再触发正则解析的错误。
备注:内容来源于stack exchange,提问作者m. lekk
相关产品推荐
相关产品推荐

