一.问题描述:
我在做一个网站搜索记录的分割工作,原始数据如下:
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.如何用正则表达式匹配到所有双引号内的逗号?
3.Python中使用多个分隔符分隔字符串re.split
https://blog.csdn.net/programmer_at/article/details/77409507?locationNum=7&fps=1
https://jingyan.baidu.com/article/84b4f5658063a360f6da32cb.html