
Python里去除字符串全部空格的几种实在办法
做股票和期货的人,每天打交道最多的不是K线,是数据。从行情接口拉回来的tick、从券商导出的成交记录、从交易所下载的日线文件,里面经常夹着各种看不见的空格。这些空格不显眼,却能让你写的策略在关键时候掉链子。股票代码前面多一个空格,跟数据库里的代码就对不上;期货合约名称中间混一个制表符,分组统计就漏掉一笔。把字符串里的空格全部干掉,是数据清洗里最基础也最不能跳过的一步。
最直接的方式:replace 一层层剥
Python字符串自带replace方法,能把指定的字符替换成另一个字符。想去掉所有普通空格,把空格替换成空字符串就行。
code = " IF2406 "
clean = code.replace(" ", "")
print(clean) # IF2406
这个写法简单粗暴,适合你明确知道字符串里只有普通空格的情况。股票代码、合约代码通常就是数字加字母,中间不会有制表符、换行符这些捣乱分子。用replace处理一下,前后空格和中间空格一次全清掉。

有一点要留意,replace不会改变原字符串,而是返回一个新的字符串。Python里字符串是不可变对象,所有看起来像修改的操作,本质上都是生成新对象。写策略的时候别指望调用完replace,原来的变量就自动变干净了,得拿返回值重新赋值。
遇到混合空白字符:正则表达式更省心
行情数据从不同渠道过来,空白字符五花八门。普通空格只是其中一种,还有制表符 \t、换行符 \n、回车符 \r,甚至全角空格。这些字符用肉眼看跟普通空格没区别,用replace一个个去替换,代码会变得又长又啰嗦。
正则表达式里的 \s 能匹配所有空白字符,包括空格、制表符、换行、回车、换页和垂直制表符。用re.sub把匹配到的空白全部替换成空字符串,一步到位。
import re
raw = " RB\t2410\n"
clean = re.sub(r"\s+", "", raw)
print(clean) # RB2410
这里用 \s+ 而不是 \s,是因为连续多个空白字符可以一次性匹配掉,减少替换次数。处理大批量行情数据时,这个细节能省下可观的CPU时间。股票每日的成交明细动辄几十万行,期货tick数据一天上百万条,正则的效率优势会慢慢体现出来。
只想去掉两头空格:strip 系列够用
有些场景不需要把字符串中间的空格也去掉。股票名称里本身就有空格,比如某些港股名称带英文和中文混合,中间的空格是有意义的分隔。这时候只清理首尾空白就够了。
Python提供strip、lstrip、rstrip三个方法。strip去掉两头空白,lstrip只去左边,rstrip只去右边。不带参数时,它们默认清理所有空白字符,跟正则里的 \s 范围一致。
name = " 贵州茅台 "
print(name.strip()) # 贵州茅台
code = "\tIH2409\n"
print(code.strip()) # IH2409
处理期货合约代码时,交易所返回的数据经常在末尾带换行符,用strip比replace更精准,不会误伤代码中间可能存在的合法字符。
性能上的取舍
数据量小的时候,replace、正则、strip这三种方式随便挑,差别肉眼看不出来。数据量上到百万级别,写法不同带来的时间差距就明显了。
replace是纯字符串操作,底层用C实现,速度最快。正则要经过模式编译和匹配引擎,开销比replace大。strip只处理首尾,不做中间扫描,速度介于两者之间。
日常清洗股票代码、期货合约代码这种格式固定的字段,优先用replace或者strip。只有面对来源混乱、空白字符种类不确定的文本,才值得动用正则。写量化策略的人,代码跑在实盘上,每一毫秒都值钱,能省则省。
容易踩的坑
全角空格是很多人忽略的陷阱。从某些财经网站复制粘贴股票名称,或者从PDF格式的研究报告里提取期货合约信息,经常会混入全角空格。全角空格的Unicode编码是 \u3000,普通空格是 \u0020,正则里的 \s 默认不匹配全角空格。
处理这类数据,得手动把 \u3000 也纳入替换范围。
import re
text = "沪铜\u30002410"
clean = re.sub(r"[\s\u3000]+", "", text)
print(clean) # 沪铜2410
另一个坑是误解replace的作用范围。replace(" ", "")确实能把所有普通空格都去掉,但对制表符和换行符无能为力。有人拿它清洗从CSV文件读出来的字段,发现换行符还在,排查半天才反应过来用错了方法。
跟pandas配合的实战场景
股票期货数据清洗,真正干活的时候很少单独处理一个字符串,都是整列整列地处理。pandas里的str访问器支持向量化操作,能把replace和正则直接应用到整个Series上。
import pandas as pd
df = pd.DataFrame({
"code": [" IF2406 ", "\tRB2410\n", " AU2412 "]
})
df["code"] = df["code"].str.replace(r"\s+", "", regex=True)
print(df)
这样写比用for循环逐行处理快得多。pandas底层用numpy数组,向量化操作没有Python循环的开销。期货行情数据一天几十万条,股票历史数据动辄上千万行,循环处理能跑几分钟,向量化可能几秒钟就完事。
清洗完的代码字段,才能拿去跟交易接口的合约列表做匹配,才能跟持仓表做关联,才能保证回测和实盘用的是同一套标的。数据干净了,策略的信号计算才靠谱,回测的收益曲线才不是自欺欺人。
写代码的人得知道的事
字符串去空格这件事,看起来是Python基础中的基础,放到股票期货的数据处理流程里,它就是一道必须跨过去的坎。用哪种方法,取决于数据来源、空白字符类型、数据量大小。replace快而直接,正则灵活而全面,strip精准而克制,pandas向量化适合批量作业。
心里清楚每种方法的边界,遇到数据脏了不慌,知道该拎哪把工具出来用,这比背下来所有API都管用。行情数据不会自己变干净,写策略的人得自己动手。