簡體   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