2011-11-13 70 views
2

這應該很簡單,但我似乎無法實現。它的目的是從Mp3tag中的mp3文件名中提取v3標籤。從字符串中提取年份的正則表達式

我有這些字符串我想提取一年。

Test String 1 (1994) -> extract 1994 
34 Test String 2 (1995)" -> extract 1995 
Test (String) 3 (1996)" -> extract 1996 

我有^(.+)\s\(([0-9]*)\)$但顯然它沒有給我我期待的結果。你可以說我用正則表達式不太好。

在此先感謝

回答

4

你可以使用類似這樣的東西\((\d{4})\)$。第一組將會有你的比賽。

說明

\(  # Match the character 「(」 literally 
(  # Match the regular expression below and capture its match into backreference number 1 
    \d  # Match a single digit 0..9 
     {4}  # Exactly 4 times 
) 
\)  # Match the character 「)」 literally 
$  # Assert position at the end of a line (at the end of the string or before a line break character) 
2

您需要轉義括號。您還可以限制一個一年只拿到了4個數字:

^(.+)\s\(([0-9]{4})\)$ 

年是matchgroup的2

+0

哎呦,似乎我忘了加上逃逸。嗯,看起來像Mp3tag沒有認出它:'(。 – nixgadgets

+0

爲什麼存儲在一個組中的字符串的開始,當它不是必需的? – Johnsyweb

+0

@Johnsyweb:你怎麼不能存儲它? – cherouvim

1

我與

^(.*)\s\(([0-9]{4})\)$ 

(假設全力以赴年有4個位數,如果你有一個未知的數字位數,但至少有一個,則使用[0-9]+;如果沒有數字,則使用[0-9]*

+0

爲什麼當字符串的開始存儲在一個組中時這不需要嗎? – Johnsyweb

+0

因爲這就是原始問題。 – Martijn

1

就快與你的正則表達式。

你真正需要的是:

\s\((\d{4})\)$ 

其中:

  • \s是一些空白
  • \(是文字 '('
  • (是匹配組的開始
  • \d is一個數字
  • {4}表示四個先前的原子(即,四位數字)
  • )是匹配組
  • \)是一個文字「)」
  • $的端部是字符串

爲了獲得最佳效果,投入的函數的末尾:

>>> def get_year(name): 
...  return re.search('\s\((\d{4})\)$', name).groups()[0] 
... 
>>> for name in "Test String 1 (1994)", "34 Test String 2 (1995)", "Test (String) 3 (1996)": 
...  print get_year(name) 
... 
1994 
1995 
1996 
7

一個更通用的解決方案的建議,不知道如果這是你所需要的。有效年限將始終具有形式19XX或20XX,而年內將有字間隔字符(不是數字或字母以外的東西)分開:

\b(19|20)\d{2}\b 

這並不真正關心那裏的標籤年出現。這不承擔任何東西比今年4個位數以上一個簡單的版本是這樣表達的:

\b\d{4}\b 

這裏的關鍵是\ b轉義序列,它匹配任何非單詞字符(字charaters是字母,數字和下劃線),當然包括括號。

也想推薦這個網站: http://www.regular-expressions.info/