具有多个捕获组的正则表达式与定义的匹配不匹配

时间:2016-07-24 12:09:24

标签: python regex

我在python上测试一些正则表达式。以下结果与任何内容都不匹配。我想匹配" Turkey"但它甚至没有回归。我花了差不多一个小时就不知道为什么它不起作用了!

import re

regex = r'\s*\(aka\s(.*)\s((?:19|20)[0-9][0-9])'
line = "    (aka Turkey (1955)) (USA) (short title)"
match = re.search(regex,line)
if match:
    print match.groups()

输出: https://repl.it/CfWa

3 个答案:

答案 0 :(得分:2)

r'\s*\(aka\s(.*)\s((?:19|20)[0-9][0-9])'的问题在于你不会在一年中逃脱括号。如果您使用:r'\s*\(aka\s(.*)\s*\((?:19|20)[0-9][0-9]\)',则会匹配"土耳其",因此我建议您使用r'\s*\(aka\s([^\s]*)\s*\((?:19|20)[0-9][0-9]\)'之类的内容。

答案 1 :(得分:1)

你可以这样做:

^\s*\([^\s]*\s+
  • Turkey([^\s]+)之前的部分匹配

  • Turkey匹配\s+并将其放入已捕获的组中,之后>>> line = " (aka Turkey (1955)) (USA) (short title)" >>> re.search(r'^\s*\([^\s]*\s+([^\s]+)\s+', line).group(1) 'Turkey' 匹配一个或多个空格

示例:

tabBarCtr.moreNavigationController.delegate = self
tabBarController.moreNavigationController.viewControllers.first?.title = ""

答案 2 :(得分:1)

改变你的一点点:

而不是(.*)使用([^\(]*?)\s*这会捕捉到开头(甚至多个单词的所有内容。

你忘记在年度组之前逃离开幕式(

regex = r'\s*\(aka\s*([^\(]*?)\s*\((?:19|20)[0-9][0-9])'
#                    --------------

然而,要使用更简单的模式,并考虑到Wolf的评论,并且认为像您试图捕获的标题一般将不止一个单词,您可以使用:

regex = r'\(aka\s*([^\(]*?)\s*\('
# or:
regex = r'\(aka\s*([\w\s]*?)\s*\('