2010-05-19 87 views
1

我遇到了一個正則表達式匹配特定情況的麻煩。我有電視的列表顯示了在約4格式:正則表達式,以確保組匹配不以特定字符結尾

  • Name.Of.Show.S01E01
  • Name.Of.Show.0101
  • Name.Of.Show.01x01
  • 名稱。 Of.Show.101

我想匹配的是顯示名稱。我的主要問題是,我的正則表達式匹配節目的名稱與前面的'。'。我正則表達式如下:

"^([0-9a-zA-Z\.]+)(S[0-9]{2}E[0-9]{2}|[0-9]{4}|[0-9]{2}x[0-9]{2}|[0-9]{3})" 

一些例子:

>>> import re 

>>> SHOW_INFO = re.compile("^([0-9a-zA-Z\.]+)(S[0-9]{2}E[0-9]{2}|[0-9]{4}|[0-9]{2}x[0-9]{2}|[0-9]{3})") 
>>> match = SHOW_INFO.match("Name.Of.Show.S01E01") 
>>> match.groups() 
('Name.Of.Show.', 'S01E01') 
>>> match = SHOW_INFO.match("Name.Of.Show.0101") 
>>> match.groups() 
('Name.Of.Show.0', '101') 
>>> match = SHOW_INFO.match("Name.Of.Show.01x01") 
>>> match.groups() 
('Name.Of.Show.', '01x01') 
>>> match = SHOW_INFO.match("Name.Of.Show.101") 
>>> match.groups() 
('Name.Of.Show.', '101') 

所以,問題是我該如何避免與期結束第一組?我意識到我可以簡單地做到:

var.strip(".") 

但是,這並不處理「Name.Of.Show.0101」的情況。有沒有辦法改進正則表達式來更好地處理這種情況?

在此先感謝。

回答

2

我認爲這會做:

>>> regex = re.compile(r'^([0-9a-z.]+)\.(S[0-9]{2}E[0-9]{2}|[0-9]{3,4}|[0-9]{2}x[0-9]{2})$', re.I) 
>>> regex.match('Name.Of.Show.01x01').groups() 
('Name.Of.Show', '01x01') 
>>> regex.match('Name.Of.Show.101').groups() 
('Name.Of.Show', '101') 

ETA:當然,如果你只是試圖從受信任的字符串不同的位,你可以只使用字符串方法:

>>> 'Name.Of.Show.101'.rpartition('.') 
('Name.Of.Show', '.', '101') 
+0

謝謝,它甚至從未將我的想法包括在內。在兩組之外。我沒有顯示整個字符串,在劇集#之後通常還有其他一些項目,比如「The.Name.Of.Show.S01E01.something.else」,所以rpartition不起作用。 – 2010-05-19 18:11:24

+0

@AJ:那麼你應該小心,不要將'$'包含到正則表達式中 – SilentGhost 2010-05-19 18:13:09

2

因此,最後一組的唯一真正限制是它不包含點?簡單:

^(.*?)(\.[^.]+)$ 

這匹配任何東西,非貪婪。重要的部分是第二組,它以一個點開始,然後匹配任何非點字符直到字符串結束。

這適用於所有的測試用例。

+0

謝謝,這看起來不錯,很好,簡潔。 – 2010-05-19 18:15:58

0

如果最後一部分從不包含點:^(.*)\.([^\.]+)$

1

我相信這會做你想做的事:

^([0-9a-z\.]+)\.(?:S[0-9]{2}E[0-9]{2}|[0-9]{3,4}|[0-9]{2}(?:x[0-9]+)?)$ 

我測試此針對節目的以下列表:

  • 30.Rock.S01E01
  • The.Office.0101
  • Lost.01x01
  • How.I.Met .Your.Mother.101

如果這4種情況代表你所擁有的文件類型,那麼這個正則表達式sho我們把節目名稱放在自己的捕捉組中,然後扔掉剩下的節目。這個過濾器可能比其他一些更具限制性,但我非常喜歡匹配你需要的東西。

1

看來問題在於你沒有指定需要最後一個組之前的時間段,所以像^([0-9a-zA-Z \。] +)\。(S [0 -9] {2} E [0-9] {2} | [0-9] {4} | [0-9] {2} X [0-9] {2} | [0-9] {3- })可能工作。

相關問題