Python正则表达式可获取所有内容,直到表达式“(year)”

时间:2018-06-20 01:35:04

标签: python regex

我有一个名为“ movie_title”的数据框列,其中包含电影名称以及年份。以下是上述专栏中的两种电影标题。

title1='Toy Story (1995)'
title2='City of Lost Children, The (Cité des enfants perdus, La) (1995)'

我想将其分为标题和发行年份两列。我能够使用以下正则表达式成功提取年份:

re.findall('[1-2][0-9]{3}', string)[0]

需要帮助编写另一个可以提取标题的正则表达式(不包括年份信息和方括号)。

例如title1和title2应该看起来像:

title1='Toy Story'
title2='City of Lost Children, The (Cité des enfants perdus, La)'

3 个答案:

答案 0 :(得分:1)

这几乎可以解决问题:

Objects/funcobject.c

您只需要除去未捕获的结尾.(?:[^\((0-9)])+ 。如果我发现更好的话,将更新此答案。

另一种想法::如果您确定年份会出现在每个电影标题的结尾,那么为什么不删除最后一点呢?因此,从您拥有的每个电影字符串中删除)吗?

答案 1 :(得分:1)

要获取年份并在末尾消除括号,请使用正则表达式“找到至少有一个数字的第一个字符串,然后加上括号”,正则表达式如下所示: '\ d +(?= \))'

1。)\ d表示找到一个数字,+ infront表示找到至少一个

2。)(?=)表示后跟。 \)表示字符“)”。因此(?= \))的意思是后跟一个')'

3。)将所有内容放在一起表示一个至少一个数字的字符串,后跟')'

输入:失落儿童之城,(拉美(Citédes enfants perdus,La))(1995年)

输出:1995年

要获取电影标题,请使用正则表达式“获取第一个字符串,该字符串包含任意数量的非数字,后跟'(',如下所示:'\ D *(?= \()'

1。)/ D表示非数字。 *表示任意数量的非数字

2。)再次,我们看到(?= \()表示后跟'('

3。)一起表示任意数量的非数字,后跟'('

输入:失落儿童之城,(拉美(Citédes enfants perdus,La))(1995年)

输出:失落儿童之城,(La La)(儿童城)

注意:获取标题的正则表达式假定标题中没有数字。

答案 2 :(得分:1)

>>> titles = [
...     'Toy Story (1995)',
...     'City of Lost Children, The (Cité des enfants perdus, La) (1995)',
... ]
>>>
>>> import re
>>>
>>> for title in titles:
...     m = re.match(r'^(.*) \((19\d\d|20\d\d)\)$', title)
...     name, year = m.groups()
...     print(f'name: {repr(name)} year: {repr(year)}')
...
name: 'Toy Story' year: '1995'
name: 'City of Lost Children, The (Cité des enfants perdus, La)' year: '1995'

regex101.com^(.*) \((19\d\d|20\d\d)\)$的解释:

explanation