2013-03-18 60 views
1

我試圖解析以下模式:正則表達式來捕捉第一運營商

名1運營商名稱2

其中「經營者」是一個&,^或|

的人羣應(name1 operator name2,name1,operator,name2)

現在,無論是名稱也可以包括&,| or ^和空格,但只有第一個出現將使運營商。進一步的出現將被認爲是name2的一部分。

我一直是這樣sturggling相當長的一段時間了,我有

\s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+) 

似乎不是很菜刀,也不管用。另外,如果有一個類似於str.partition()的函數可以使用正則表達式並將結果限制爲1,那就太好了。我找不到一個。

正則表達式或函數的任何想法?由於

回答

3
In [163]: re.split(r'\s*([&|^])\s*', 'name1|name2', maxsplit=1) 
Out[163]: ['name1', '|', 'name2'] 

maxsplit=1原因re.split使至多比賽:

In [164]: re.split(r'\s*([&|^])\s*', 'name1|nam^e2', maxsplit=1) 
Out[164]: ['name1', '|', 'nam^e2'] 

你也可以使用非貪婪搜索:

In [184]: re.search(r'\s*(.*?)\s*([&|^])\s*(.*?)\s*', 'name1 | nam^e2').groups() 
Out[184]: ('name1', '|', 'nam^e2') 

這個也有跳開了優勢字符串開頭和結尾的空格。

第一組的非貪婪,(.*?)([&|^])允許匹配的&|,或^第一次出現。

+0

尼斯我們如何在同一時間寫了幾乎相同的正則表達式,但我用'+',所以它不會匹配孤獨'|'或'? foo&' – JBernardo 2013-03-18 17:47:37

+0

此外,通過貪婪,最後的'。*'將匹配最後的空格...... – JBernardo 2013-03-18 17:52:38

+0

感謝您的更正,@JBernardo。 – unutbu 2013-03-18 17:55:43

1

一個選項來刪除多餘的空格:

>>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups() 
('foo', '|', 'bar & lol')