Chinaunix

标题: 【求助】关于正则表达式,遇到一个情况,不知道如何匹配该模式,求助大牛~ [打印本页]

作者: fzc115100    时间: 2012-06-01 11:02
标题: 【求助】关于正则表达式,遇到一个情况,不知道如何匹配该模式,求助大牛~
是一个csv文件,
以前都是以逗号“,”作为分隔符的。

但是现在遇到一个新情况类似这种:
a,"b,c,d",e

如上这行字符,我想分成三组:
a
b,c,d
e

请教应如何实现?
谢谢~
作者: fzc115100    时间: 2012-06-01 11:04
其中a代表若干数字或字符,若干:不确定。
bcde也如此,且bcd也是若干个,即有可能是"b,c,d,e,f,g"
作者: fzc115100    时间: 2012-06-01 11:08
但是我能却行其中的分组数量,
即我可以提供:这一行我将分成多少个组,
例如:a,"b,c,d",e 三组
a,"b,c,d",e,f,"g,h" 五组
作者: anonymous0502    时间: 2012-06-01 11:09
本帖最后由 anonymous0502 于 2012-06-01 12:25 编辑

。。。                     
作者: fzc115100    时间: 2012-06-01 11:18
貌似可以通过csv模块来实现我想要的功能,
但是我还是想知道csv模块是如何实现的?
权当锻炼脑筋了。

期待并且感谢大牛的解答!
作者: anonymous0502    时间: 2012-06-01 12:28
好像也是用正则表达式来做的,表达式有点复杂
源代码文件有的啊
作者: fzc115100    时间: 2012-06-01 13:02
回复 6# anonymous0502

恕在下无知,C语言支持正则表达式吗?我不是很清楚。。。


   
作者: anonymous0502    时间: 2012-06-01 13:07
回复 7# fzc115100

这个我也不太清楚,好像标准的不支持,也要靠其它库吧
  1. >>> import csv
  2. >>> csv.__file__
  3. 'c:\\python32\\lib\\csv.py'
复制代码

作者: fzc115100    时间: 2012-06-01 13:42
回复 8# anonymous0502
是我理解有误,感谢ls!


   
作者: yinyuemi    时间: 2012-06-01 13:54
回复 1# fzc115100


    有这情况么?
a,"b"c",d,e
->
a
b"c
d
e
换句话,双引号都是成对出现的么?
作者: fzc115100    时间: 2012-06-01 14:38
回复 10# yinyuemi
一定是成对出现的。
谢谢.

还想请教另一个问题,chinaunix回帖怎么重视需要验证码啊?
是否在一定时间或一定回帖数量之后就不在需要了?

每次都这样真的很烦。。。

   
作者: anonymous0502    时间: 2012-06-01 14:45
你的发帖量多了就没有这个验证了
作者: yinyuemi    时间: 2012-06-01 14:57
回复 11# fzc115100
  1. s='a,"b,c,d",e,f,"g,h",i'

  2. re.findall("\"[^\"]+\"|[^,]+(?=,)|[^,]+$",s)
  3. ['a', '"b,c,d"', 'e', 'f', '"g,h"', 'i']
复制代码

作者: fzc115100    时间: 2012-06-01 15:20
回复 13# yinyuemi
非常感谢,这里引出另一个问题。
正则表达式里面的“|”的执行顺序:
先执行前面的一项,匹配一圈,然后再匹配后面的那项是这个顺序吗?
因为我改变了一下format:
  1. re.findall("[^,]+(?=,)|\"[^\"]+\"",s)
复制代码
结果就不是那么回事儿了。。。

还想请教另一个问题:
http://bbs.chinaunix.net/thread-3750185-1-1.html

多谢了


   
作者: happybj20008    时间: 2012-06-01 15:42
回复 1# fzc115100

关键的问题就是,出现在两个"中间就不是分隔符,否则是分隔符
正则式肯定可以写,但可能比较费事
遇到这种问题我都是用一个土办法,首先把,全部用#(任意字符,只要原文中没有就行)替换,然后再把#"和"#替换成,再按照,分隔,最后把剩下的#再替换成,
a,"b,c,d",e ---> a#"b#c#d"#e --->a,"b#c#d",e

   
作者: cdtits    时间: 2012-06-01 16:10
  1. >>> s = 'a,"b,c,d",e'
  2. >>> import re
  3. >>> t = re.search(r'(.*?),"([^"]+)",(.*), s)
  4. >>> print t.groups()
  5. ('a', 'b,c,d', 'e')
  6. >>>
复制代码

作者: fzc115100    时间: 2012-06-01 18:06
回复 15# happybj20008

谢谢,有效!


   
作者: lj2009jl    时间: 2012-06-02 12:06
回复 17# fzc115100


    有bug,对付第二个例子
'a,"b,c,d",e,f,"g,h",i'
就有问题,
作者: fzc115100    时间: 2012-06-04 08:43
回复 18# lj2009jl
呵呵,是的 谢谢提醒,其实第二个例子通用性不强,只针对一种情况的匹配。
感谢一下表示对回答我问题的人的尊敬。


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2