Python Regex将vary字符串拆分为groupdict

Python Regex将vary字符串拆分为groupdict,python,regex,python-2.7,Python,Regex,Python 2.7,我想从我的数据中提取一些信息。 最完整的行可能如下所示(每个部分可能包含CJK字符): 0。(活动)(标签)[团体(艺术家)]标题(表格)[addition1][addition2] 一行也可以是: 1. (event) [group (artist)] title (form) [addition1] 2. [event] [group (artist)] title (form) (addition1) 3. (tag) [group (artist)] title 4. [group

我想从我的数据中提取一些信息。

最完整的行可能如下所示(每个部分可能包含CJK字符):

0。(活动)(标签)[团体(艺术家)]标题(表格)[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】
如我们所见,最简单的行就是纯文本
标题
,
我写了一个正则表达式,试图匹配所有的正则表达式

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()
重新导入
正则表达式=ur'([\(\[](P[^\)\]*)[\)\]]?\s*([\[(\[](P[^\)\](\)\]]*)[\)\]])?\s*(\[(?P[^\(\]*)((?P[^\]*)?)((?P[^(\[)\]*))((?[\[\[)*))((\[\[\[](P[))*)))([\]*)*)((?)([\]*)*)(?)([\]]
p=重新编译(正则表达式)
行=[
"(活动)(标签)(团体(艺术家))名称(表格)(增补1)(增补2)",
"(活动)(团体(艺术家))名称(表格)(增补1)",
“[活动][团体(艺术家)]标题(表格)(增补1)”,
"(标签)[团体(艺术家)]名称",,
“[团体(艺术家)]名称”,
“头衔”,
]
对于行中的r:
r=重新搜索(p,r)
打印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'
{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':无,u'event':'event'}
{u'from':'form',u'more1':'addition1',u'artist':'artist',u'title':'title',u'group':'group',u'type':无,u'event':'event'}
{u'from':无,u'more1':'group(艺术家),u'artist':无,u'title':'',u'group':无,u'type':无,u'event':'tag'}
{u'from':无,u'more1':'group(艺术家),u'artist':无,u'title':'',u'group':无,u'type':无,u'event':无}
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
15对于行中的r:
16 r=重新搜索(p,r)
--->17 print r.groupdict()
AttributeError:“非类型”对象没有属性“groupdict”
第4行的结果出乎意料。
我认为
re
应该从中间搜索。首先查找
[group(artist)]和title
,但我不知道如何用正则表达式编写。 还是我做错了?

编辑

看起来(至少在您提供的示例中)您可以正确地将整个字符串与以下内容进行匹配和分组:

^(?:(?:^[\[()](?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>[^\])]+)[\])])?)?$

此正则表达式由两部分组成:

  • (?:^[\[()](?P[^)\]+[)\]](?=.+[\]]]]$)\s)?
    -匹配事件

  • (?:[(【】)(?P(?
    title
    与正则表达式不匹配,因此您有一个问题。我想
    如果r:print r.groupdict()
    不是您想要的,right@stribizhev我希望正确获取所有属性。第4行:u'more1':'组(artist',u'artist',此属性已经错误。你太好了!你如何强制从中间重新匹配字符串?你能做一些解释吗?这么多
    让我很沮丧,这让我希望有一种从中间匹配的方法。谢谢你的解释:)。
    import re
    
    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',
    ]
    
    p = re.compile(ur'^(?:(?:^[\[()](?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>[^\])]+)[\])])?)?$')
    
    for r in rows:
        [m.groupdict() for m in p.finditer(r)]
        print m.groupdict()
    
    {u'event': 'event', u'tag': 'tag', u'group': 'group', u'artist': 'artist', u'title': 'title ', u'form': 'form', u'add': 'addition1', u'add2': 'addition2'} 
    {u'event': 'event', u'tag': None, u'group': 'group', u'artist': 'artist', u'title': 'title ', u'form': 'form', u'add': 'addition1', u'add2': None} 
    {u'event': 'event', u'tag': None, u'group': 'group', u'artist': 'artist', u'title': 'title ', u'form': 'form', u'add': 'addition1', u'add2': None} 
    {u'event': None, u'tag': 'tag', u'group': 'group', u'artist': 'artist', u'title': 'title', u'form': None, u'add': None, u'add2': None} 
    {u'event': None, u'tag': None, u'group': 'group', u'artist': 'artist', u'title': 'title', u'form': None, u'add': None, u'add2': None} 
    {u'event': None, u'tag': None, u'group': None, u'artist': None, u'title': 'title', u'form': None, u'add': None, u'add2': None}