2011-11-13 42 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/