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

一.问题描述:

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

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

猜你喜欢

转载自blog.csdn.net/skj1995/article/details/83055338