2013-05-18 28 views
2

我已閱讀文檔並查看其他問題,但我沒有找到答案。可能在集合中使用插入符號和前瞻符號?

是否可以在一個集合中使用一個lookahead,或在一個集合中使用一個lookahead作爲補充?

我想創建一個匹配每個字符的集合,除了空格前面的破折號。但是,如果只有一個空間沒有跟着一個短劃線,它應該是一個匹配。

我在想這樣的事情會的工作,但它並不:

r'[^\s(?=\-)]' 

不要向前看符號不是一套內部工作?如果不是,我怎麼能解決這個問題呢?

編輯提供的例子:

我一直在試圖找到一個更準確的替代

r'([^\-]*)\-(.*)' 

其目的是讀取標題行和獨立藝術家。

應用re.match(r'([^\-]*)\-(.*)', "artist - title")應該產生:

group(1) = "artist" 
group(2) = "title" 

但是如果藝術家名稱中包含破折號的字符串錯誤的部分被捕獲。

實施例:

re.match(r'([^\-]*)\-(.*)', "jay-z - title") 

將產生:

group(1) = "jay" 
group(2) = "z - title" 

我想捕獲組來捕獲空間和破折號,但如果它是前面有一個空格不捕獲破折號(或如果後面跟着一個破折號,則假設前視與後視)。

+0

請問您可以舉一些例子,說明您有什麼和要匹配什麼以及哪些不匹配? – Jerry

+0

更新爲包含示例 –

回答

1

有兩個問題。

  1. 字符類指定數的可能性在文本被搜索匹配單個字符。向前和向後隱藏條件你會匹配的字符,但不是部分該字符。

  2. 前瞻字符在字符類中不是特別的 - 它們被視爲文字字符。你的角色分類r'[^\s(?=\-)]'等同於r'[^\-)(?\s=]',意思是「匹配除了=,?,(,空白以及\和之間的所有字符)之外的每個字符」。

對於你似乎想要做什麼,嘗試每一個字符匹配除了儀表板,並用交替獲得不受空間前面的破折號:

r'([^-]|(?<!\s-))' 

(編輯後問題補充例子)

如果你能相信' - '總是從歌名分離藝術家,而且將永遠在它第一次出現這樣做,你可以只使用在EAC的split方法ħ字符串,如下所示:

>>> "jay-z - title".split(' - ', 1) 
['jay-z', 'title'] 
>>> 'prince - purple rain'.split(' - ', 1) 
['prince', 'purple rain'] 
>>> 'prince - purple rain - a love-song'.split(' - ', 1) 
['prince', 'purple rain - a love-song'] 

split需要在其上分割的子字符串,和拆分的一個可選的最大數目,從該字符串做。 split返回源字符串拆分成拆分參數的子字符串列表,並刪除拆分參數。

指定最大拆分數量N將返回N + 1個子字符串的列表,並刪除拆分目標的前N個實例。任何後續的拆分目標實例都會留在原地。

split默認爲左到右的字符串的閱讀,你可以得到的字符串從右到左的閱讀與rsplit,這也支持maxsplit可選參數:

>>> 'prince - purple rain - a love-song'.split(' - ', 1) 
['prince', 'purple rain - a love-song'] 
>>> 'prince - purple rain - a love-song'.rsplit(' - ', 1) 
['prince - purple rain', 'a love-song'] 

內置在字符串類型有很多功能,你可以在Python documentation找到。

+0

好的和正確的答案,我想知道誰和爲什麼這是低估。 – HamZa

+0

可能是因爲我在解決剩下的問題時放了一個小的回答。在發佈之前應該完成這個想法,而不是太過於貪戀佔位符。 – pcurry