您现在的位置是:时尚 >>正文
python split引号
时尚61人已围观
简介```html python split引号 写爬虫那会儿,我碰上一串脏数据:'name': 'O'Reilly, "The Great"', 'age': 30。想用 split(',' ...
写爬虫那会儿,我碰上一串脏数据:'name': 'O'Reilly, "The Great"', 'age': 30。想用 split(',') 切分,结果引号里的逗号也被切了。这不是 split 的错,是引号在捣乱。Python 的 str.split() 只认分隔符,不认引号——它不会因为你用了单引号或双引号就跳过里面的内容。
很多人第一次遇到这种问题,会下意识觉得 split 应该“智能”一点。可惜它就是个老实巴交的字符串方法:你给它一个分隔符,它从头到尾扫一遍,见到就切。引号?它当普通字符处理。比如 "a,b,'c,d',e".split(','),出来的是 ['a', 'b', "'c", "d'", 'e']。你看,单引号被切成了两半。
那怎么办?几种实际的做法
最省事的办法是用 csv 模块。它天生处理引号包围的字段。csv.reader 默认把双引号当作引用符,逗号在引号内不切分。但你得注意:它默认只认双引号,单引号不管。如果你的数据混用单双引号,就得手动指定 quotechar,而且一次只能指定一个。我试过用 quotechar="'" 去读 "a,'b,c',d",结果双引号那部分又出问题。所以 csv 不是万能药。
另一个思路是用正则。re.split 可以配合负向断言,但写起来容易翻车。比如想切逗号但不在引号内,得写 re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', s)——这还只处理双引号。如果引号里还有转义,复杂度直接爆炸。我一般不建议新手走这条路,除非你确定数据格式极其规整。
手动解析其实更可控。写个循环,记录当前是否在引号内,遇到分隔符时判断一下。代码不长,十行左右。下面这个我用了好几年,处理单双引号混合也没问题:
def split_quoted(s, delim=','): parts = [] buf = [] in_quote = None for ch in s: if ch in ('"', "'"): if in_quote is None: in_quote = ch elif in_quote == ch: in_quote = None buf.append(ch) elif ch == delim and in_quote is None: parts.append(''.join(buf)) buf = [] else: buf.append(ch) parts.append(''.join(buf)) return parts 注意,这个版本把引号也保留在结果里。如果你想去掉,可以在最后 strip 一下,或者加个判断。我通常保留,因为后续可能还要区分字段是否被引用过。
split 本身有个鲜为人知的参数
str.split() 不传分隔符时,会按任意空白切分,并且连续空白算一个。但传了分隔符,连续分隔符会产生空字符串。比如 "a,,b".split(',') 得到 ['a', '', 'b']。很多人被这个空字符串坑过。如果你不想要空串,可以用列表推导过滤:[x for x in s.split(',') if x]。但小心——如果空字段有意义(比如 CSV 里的空值),过滤就错了。
还有 rsplit,从右边开始切,最多切几次。处理文件路径时偶尔用得上。比如 "a/b/c/d".rsplit('/', 1) 得到 ['a/b/c', 'd']。这个跟引号无关,但既然聊到 split,顺带提一句。
引号嵌套?别想了
如果数据里出现 "He said 'hi'" 这种嵌套引号,上面所有方法都会失效。手动解析器也救不了你,因为它无法区分引号的层级。这种时候只能上 ast.literal_eval 或者 json.loads,前提是数据恰好是合法的 Python 字面量或 JSON。我遇到过从日志里扒出来的伪 JSON,单引号双引号混着来,最后是用 demjson 这种第三方库搞定的。但那是另一个话题了。
说到底,split 加引号的问题,根源在于字符串本身没有结构信息。你看到的引号,对 Python 来说就是普通字符。想让它“聪明”,要么换工具(csv、json),要么自己写解析逻辑。没有银弹。
我现在的习惯:拿到带引号的字符串,先看格式是否固定。固定的话,正则一把梭;不固定,手动循环。别指望 split 能读懂你的意图——它就是个切刀,不是大脑。
Tags:
相关文章
会员渗透率计算公式怎么算
时尚会员渗透率这事儿,说穿了就是看你圈住的那一亩三分地里,到底有多少人真掏了钱。公式不复杂:会员渗透率 = 活跃付费会员数 ÷ 总目标用户数 × 100%。但你要是真按这个数去跟老板汇报,八成会被问得下不 ...
【时尚】
阅读更多ssm架构的优点
时尚SSM架构——Spring、SpringMVC、MyBatis这三兄弟的组合,在Java后端开发里火了十几年,至今仍是中小型项目的首选。说它过时的人不少,但真正上手用过的人,心里都清楚它有多顺手。 先 ...
【时尚】
阅读更多国外网站购物平台
时尚我去年在德国一家叫Kaufland的网站上买了个博世电钻,比国内便宜了将近一半。但真正让我意外的是物流——下单第七天,包裹出现在我上海家门口,包装盒上印着DHL的运单号,里面还附了一张手写体的德文感谢 ...
【时尚】
阅读更多