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

2024-06-11 15:47:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在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


Tags: importre内容searchiftitlematchline
3条回答

你可以做:

re.search(r'^\s*\([^\s]*\s+([^\s]+)\s+', line).group(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'

改变一下你所拥有的:

使用(.*)而不是([^\(]*?)\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*\('

r'\s*\(aka\s(.*)\s((?:19|20)[0-9][0-9])'的问题是,你不能在一年中用括号转义。如果您使用:r'\s*\(aka\s(.*)\s*\((?:19|20)[0-9][0-9]\)',您将匹配“Turkey”,因此我建议使用类似r'\s*\(aka\s([^\s]*)\s*\((?:19|20)[0-9][0-9]\)'的内容。你知道吗

相关问题 更多 >