我正在尝试解析以下字符串
s1 = """ "foo","bar", "foo,bar" """
并且我希望解析这个解析...
List ["foo","bar","foo,bar"] length 3
我能够解析以下内容
s2 = """ "foo","bar", 'foo,bar' """
使用以下模式
pattern = "(('[^']*')|([^,]+))"
re.findall(pattern,s2)
gives [('foo', '', 'foo'), ('bar', '', 'bar'), ("'foo,bar'", "'foo,bar'", '')]
但是我无法找出s2的模式..注意我需要成功解析s1和s2
Edit
The current pattern support strings like
"foo,bar,foo bar" => [foo,bar,foo bar]
"foo,bar,'foo bar'" => ["foo","bar",'foo bar']
"foo,bar,'foo, bar'" => [foo,bar, 'foo, bar'] #length 3
答案 0 :(得分:4)
我认为shlex
(simple lexical analysis)在这里是更简单的解决方案(当regex
过于复杂时)。具体来说,我会使用:
>>> import shlex
>>> lex = shlex.shlex(""" "foo","bar", 'foo,bar' """, posix=True)
>>> lex.whitespace = ',' # Only comma will be a splitter
>>> lex.whitespace_split=True # Split by any delimiter defined in whitespace
>>> list(lex) # It is actually an generator
['foo', 'bar', 'foo,bar']
编辑:
我感觉你正在尝试阅读csv文件。你试过import csv
吗?
答案 1 :(得分:2)
也许你可以使用这样的东西:
>>> re.findall(r'["|\'](.*?)["|\']', s1)
['foo', 'bar', 'foo,bar']
>>> re.findall(r'["|\'](.*?)["|\']', s2)
['foo', 'bar', 'foo,bar']
这会查找"..."
或'...'
内的所有字词并对其进行分组。
答案 2 :(得分:1)
这有效:
(?:"([^"]+)"|'([^']+)')
捕获组1 或两个包含所需的输出。所以每个元素都可以是$1$2
,因为一个元素总是空的。
在Haidro的回答评论中更新了新要求:
(?:("[^"]+")|('[^']+')|(\w+))
每个元素现在都是$1$2$3
。