繁体   English   中英

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

[英]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']

这个发现所有的话里面"..."'...' ,并将它们分组。

这有效:

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

正则表达式可视化

Debuggex演示

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


更新为新要求,如对Haidro的答案的评论:

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

正则表达式可视化

Debuggex演示

现在每个元素为$1$2$3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM