我想从我的数据中提取一些信息。
最完整的行可能如下所示(每个部分可能包含CJK字符):
0. (event) (tag) [group (artist)] title (form) [addition1] [addition2]
一行也可以是:
1. (event) [group (artist)] title (form) [addition1]
2. [event] [group (artist)] title (form) (addition1)
3. (tag) [group (artist)] title
4. [group (artist)] title
5. title
6. and something like above, such as 【tag】 [group (artist)] title 【form】
如我们所见,最简单的一行就是纯文本title
,
我写了一个正则表达式来匹配所有的正则表达式
import re
regex_patern = ur'([\(\[](?P<event>[^\)\]]*)[\)\]])?\s*([\(\[](?P<type>[^\)\](\)\])]*)[\)\]])?\s*(\[(?P<group>[^\(\]]*)(\((?P<artist>[^\)]*)\))?\])?(?P<title>[^\(\)\[\]]*)([\(\[](?P<from>[^\)\]]*)[\)\]])?(\s*[\(\[](?P<more1>[^\)\]]*)[\)\]])'
p = re.compile(regex_patern)
rows= [
'(event) (tag) [group (artist)] title (form) [addition1] [addition2]',
'(event) [group (artist)] title (form) [addition1]',
'[event] [group (artist)] title (form) (addition1)',
'(tag) [group (artist)] title',
'[group (artist)] title',
'title',
]
for r in rows:
r = re.search(p, r)
print r.groupdict()
输出:
{u'from': 'form', u'more1': 'addition1', u'artist': 'artist', u'title': ' title ', u'group': 'group ', u'type': 'tag', u'event': 'event'}
{u'from': 'form', u'more1': 'addition1', u'artist': 'artist', u'title': ' title ', u'group': 'group ', u'type': None, u'event': 'event'}
{u'from': 'form', u'more1': 'addition1', u'artist': 'artist', u'title': ' title ', u'group': 'group ', u'type': None, u'event': 'event'}
{u'from': None, u'more1': 'group (artist', u'artist': None, u'title': '', u'group': None, u'type': None, u'event': 'tag'}
{u'from': None, u'more1': 'group (artist', u'artist': None, u'title': '', u'group': None, u'type': None, u'event': None}
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-831c548bc3f0> in <module>()
15 for r in rows:
16 r = re.search(p, r)
---> 17 print r.groupdict()
AttributeError: 'NoneType' object has no attribute 'groupdict'
从第4行开始,结果变得出乎意料。
我认为re
应该从中间搜索。首先查找[group (artist)] and title
,但我不知道如何用regex编写。
还是我做错了?你知道吗
编辑
看起来(至少在您提供的示例中)您可以正确地匹配整个字符串并将其分组:
DEMO
用于:
提供输出:
DEMO
这个正则表达式由几个部分组成:
(?:^[\[()](?P<event>[^)\]]+)[)\]](?=.+[\])]$)\s)?
-匹配事件(?:[(【](?P<tag>(?<=^[(【])[^】)]+(?=.+[\w】]$)|(?<=\)\s\()[^)]+(?=\)\s\[))[】)]\s)?
-匹配标记\[(?:(?P<group>[^(\]]+)\s+\((?P<artist>[^)]+)\)\])\s+)?
-匹配组(?P<title>[^(\n)【]+)
-匹配标题(?:\s*[\(【](?P<form>[^)】]+)[)】](?:\s*[\[(](?P<add>[^\])]+)[\])])?(?:\s*[\[(](?P<add2>[^\])]+)[\])])?)?
-匹配形式和加法如您所见,除了与
title
匹配的部分之外,每个部分都以?
量词结尾,这意味着零或一。因此,这些部分是可选的,如果有要匹配的片段,它将匹配,但如果没有,它将不会干扰(至少不应该干扰)regex的其余部分的工作方式。这就是为什么它看起来像是匹配“从中间”,而不是“从左到右”。你知道吗相关问题 更多 >
编程相关推荐