Python中利用正则表达式用逗号分割数据,但是忽略引号中的逗号的方法

本文介绍如何使用Python正则表达式处理字符串,目标是按逗号分割数据,但忽略引号内的逗号。在处理网站搜索记录时遇到的问题是,直接使用split()函数会将花括号和引号内的逗号一起作为分隔符。解决方案是先用正则表达式提取花括号内的内容,再利用特定规则的逗号进行分割,如""匹配引号,,匹配逗号,s匹配空格。通过这种方法,成功地实现了所需的结果。" 109700853,10199996,使用栈计算表达式的Java实现,"['数据结构', 'Java', '算法', '栈', '字符串处理']

前言:本博客中我们将对我们使用的数据进行说明,对使用到的正则表达式进行逐个字符的解释,并且给出进一步详细学习正则表达式的资料。

一.问题描述:

我在做一个网站搜索记录的分割工作,原始数据如下:

x= '{"娇妻有毒路明": "0.013", "娇妻有毒%2c陆少宠上瘾": "0.078",\
 "娇妻有毒老公你放松点": "0.021", "娇妻有毒陆明白芬": "0.011", "娇妻有毒:陆少,宠上瘾": "0.051"}'

x是一个字符串,我准备先提取{ }里面的数据,然后将每个项用逗号分割出来,得到如下的形式:

['"娇妻有毒路明": "0.013', 
'娇妻有毒%2c陆少宠上瘾": "0.078', 
'娇妻有毒老公你放松点": "0.021', 
'娇妻有毒陆明白芬": "0.011', 
​​​​​​​'娇妻有毒:陆少,宠上瘾": "0.051"']

但是我用str.split(",",1)分割的时候得到的是如下的形式:

['{"娇妻有毒路明": "0.013"',
 ' "娇妻有毒%2c陆少宠上瘾": "0.078", 
"娇妻有毒老公你放松点": "0.021", 
"娇妻有毒陆明白芬": "0.011", 
"娇妻有毒:陆少,
宠上瘾": "0.051"}']

这里有两个问题:第一:将花括号也分割在了第一个和最后一个项里面了,第二:在划分原始数据最后一项

"娇妻有毒:陆少,宠上瘾": "0.051"

的时候将引号里面的逗号也当做一个分割符了,最后一项分割得到的结果为:

"娇妻有毒:陆少,
宠上瘾": "0.051"}'

两项。

二.解决方法:

首先用正则表达式将花括号中的数据提取出来:

x= '{"娇妻有毒路明": "0.013", "娇妻有毒%2c陆少宠上瘾": "0.078",\
 "娇妻有毒老公你放松点": "0.021", "娇妻有毒陆明白芬": "0.011", "娇妻有毒:陆少,宠上瘾": "0.051"}'
p1 = re.compile(r'[{](.*?)[}]', re.S)  #最小匹配
x_re=re.findall(p1, x)[0]#匹配花括号里面的数据

 

对正则表达式进行解释:

1.正则匹配串前加了r就是为了使得里面的特殊符号不用写反斜杠了。

2.[ ]具有去特殊符号的作用,也就是说[{]里的{只是平凡的括号

3.正则匹配串里的()是为了提取整个正则串中符合括号里的正则的内容

4. .是为了表示除了换行符的任一字符。*表示.匹配到的字符可以出现0次或无限次。

5. 加了?是最小匹配,也就是说匹配符合这个条件的最短字符,不加是贪婪匹配。

6. re.S是为了让.表示除了换行符的任一字符。

上面的解释参考下面这个博客:

https://blog.csdn.net/your_answer/article/details/80456550

然后用逗号进行分割,咱们想要的用作分割的逗号是这样的:一个引号+一个逗号+一个空格+一个引号,而不像要作分割符的逗号是在引号里面,两边是汉字、英文字母或者数字,所以可以按照下面方法的操作:

x_re_split=re.split('\",\s\"',x_re)#用逗号加引号分割数据

 最终的结果如下:

['"娇妻有毒路明": "0.013', 
'娇妻有毒%2c陆少宠上瘾": "0.078', 
'娇妻有毒老公你放松点": "0.021', 
'娇妻有毒陆明白芬": "0.011', 
'娇妻有毒:陆少,宠上瘾": "0.051"']

得到了我们想要的结果。

对上面的正则表达式进行解释:

\"匹配引号

,匹配逗号

\s匹配空格

三.参考资料

1.正则表达式的详细语法

http://www.runoob.com/regexp/regexp-syntax.html

2.如何用正则表达式匹配到所有双引号内的逗号?

https://www.v2ex.com/t/376764

3.Python中使用多个分隔符分隔字符串re.split

https://blog.csdn.net/programmer_at/article/details/77409507?locationNum=7&fps=1

https://jingyan.baidu.com/article/84b4f5658063a360f6da32cb.html

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skj1995

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值