如何使用正则表达式解析字符串?

时间:2014-04-12 23:04:42

标签: python 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

3 个答案:

答案 0 :(得分:4)

我认为shlexsimple 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)

这有效:

(?:"([^"]+)"|'([^']+)')

Regular expression visualization

Debuggex Demo

捕获组1 两个包含所需的输出。所以每个元素都可以是$1$2,因为一个元素总是空的。


在Haidro的回答评论中更新了新要求:

(?:("[^"]+")|('[^']+')|(\w+))

Regular expression visualization

Debuggex Demo

每个元素现在都是$1$2$3