Я хочу извлечь некоторую информацию из моих данных.
Regex для разделения строки в groupdict
наиболее полный ряд, может быть, как показано ниже (каждая часть может содержать 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】
Как мы видим, самый простой row is just plain text 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
, но я не знаю, как писать в регулярном выражении. Или я делаю неправильный путь?
'title' не соответствует регулярному выражению, поэтому у вас есть проблема. Я думаю, 'if r: \t print r.groupdict()' не то, что вы хотите, правильно –
@stribizhev Я хочу получить все атрибуты правильно.Строка 4: u'more1 ':' group (artist ', u'artist', этот атрибут был уже неправильным. – Mithril
Я обновил ответ –