2011-10-22 35 views
2

我想在Python中編寫一個正則表達式,將匹配帶空格的引號字符串或不帶空格的不帶引號的字符串。例如,給定字符串term:foo,結果將爲foo,並且給定字符串term:"foo bar",結果將爲foo bar。到目前爲止,我想出了以下正則表達式:Python的正則表達式,以匹配一個引用或不帶引號的字符串

r = re.compile(r'''term:([^ "]+)|term:"([^"]+)"''') 

的問題是,這場比賽可以進來要麼group(1)group(2)所以我必須做這樣的事情:

m = r.match(search_string) 
term = m.group(1) or m.group(2) 

是有一種方法可以一步完成這一切嗎?

+1

你知道'shlex.split( )'? – utapyngo

+1

引用的字符串是否可以包含轉義引號? – ridgerunner

+0

我不擔心逃脫的報價。 – user27478

回答

4

避免分組,而是使用前瞻/向後斷言,以消除不需要的部分:

s = 'term:foo term:"foo bar" term:bar foo term:"foo term:' 
re.findall(r'(?<=term:)[^" ]+|(?<=term:")[^"]+(?=")', s) 

給出:

['foo', 'foo bar', 'bar'] 
1

這似乎並不是你真的想re.match在這裏。你的正則表達式幾乎是正確的,但你分組太多了。這個怎麼樣?

>>> s 
('xyz term:abc 123 foo', 'foo term:"abc 123 "foo') 
>>> re.findall(r'term:([^ "]+|"[^"]+")', '\n'.join(s)) 
['abc', '"abc 123 "'] 
+0

這也匹配我不想要的封閉引號。 – user27478

相關問題