如何用Python re.sub()正则仅去除CSV指定行首尾空格/制表符
用Python re.sub()仅清理CSV指定行字段的首尾空白
需求说明
需要编写正则表达式,通过Python的re.sub()方法,仅去除CSV文件中用户指定行内各字段的首尾空格/制表符,其余行保持完全不变。
示例数据
原始CSV文本:
"Column1 "," Column2"," Column3 ","Column4","Column5" "Record11 "," Record12"," Record13 ","Record14","Record15" "Record21 "," Record22"," Record23 ","Record24","Record25" "Record31 "," Record32"," Record33 ","Record34","Record35"
预期输出
仅目标行字段的首尾空白被清理,其余行保持原样:
"Column1","Column2","Column3","Column4","Column5" "Record11 "," Record12"," Record13 ","Record14","Record15" "Record21 "," Record22"," Record23 ","Record24","Record25" "Record31 "," Record32"," Record33 ","Record34","Record35"
解决方案
你之前的正则会全局匹配所有行的字段,问题出在没有锁定目标行范围。下面是精准匹配指定行的实现:
代码实现
import re csv_text = '''"Column1 "," Column2"," Column3 ","Column4","Column5" "Record11 "," Record12"," Record13 ","Record14","Record15" "Record21 "," Record22"," Record23 ","Record24","Record25" "Record31 "," Record32"," Record33 ","Record34","Record35" ''' # 设定要处理的目标行号(从1开始计数) target_line = 1 # 构建正则:精准锁定目标行,匹配该行内带首尾空白的字段 pattern = re.compile( rf'(?<=^(?:.*\n){{{target_line-1}}})"\s*(.*?)\s*"(?=,|$)', flags=re.DOTALL | re.MULTILINE ) # 执行替换 cleaned_csv = pattern.sub(r'"\1"', csv_text) print(cleaned_csv)
正则逻辑拆解
(?<=^(?:.*\n){{{target_line-1}}}):正向后顾断言,用来定位目标行的起始位置。比如要处理第1行时,这个断言就是(?<=^)(匹配行首);处理第3行时,就是(?<=^.*\n.*\n)(跳过前两行)。"\s*(.*?)\s*":匹配字段中被引号包裹、且首尾带有空格/制表符的内容,.*?是非贪婪匹配,避免跨字段匹配。(?=,|$):正向前瞻断言,确保匹配的引号后面是字段分隔符(逗号)或行尾,防止误匹配。re.DOTALL+re.MULTILINE:让.能匹配换行符,同时让^匹配每行的开头,保证行号定位准确。
灵活适配
如果需要处理其他行,比如第3行,只需要修改target_line = 3即可,正则会自动定位到目标行并清理字段空白,其他行不受影响。
内容的提问来源于stack exchange,提问作者Suraj raghu
相关产品推荐
相关产品推荐

