[英]how to parse a string using regex?
我正在尝试解析以下字符串
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
我认为shlex
( 简单词法分析 )在这里更简单(当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
吗?
也许您可以使用如下所示的内容:
>>> re.findall(r'["|\'](.*?)["|\']', s1)
['foo', 'bar', 'foo,bar']
>>> re.findall(r'["|\'](.*?)["|\']', s2)
['foo', 'bar', 'foo,bar']
这个发现所有的话里面"..."
或'...'
,并将它们分组。
这有效:
(?:"([^"]+)"|'([^']+)')
捕获组1 或 2包含所需的输出。 所以每个元素可能是$1$2
,因为恰好一个元素总是空的。
更新为新要求,如对Haidro的答案的评论:
(?:("[^"]+")|('[^']+')|(\w+))
现在每个元素为$1$2$3
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.