LINUX.ORG.RU

Разбор строки в Python

 ,


1

2

Доброго времени суток, пишу на python небольшого бота для IRC. Подскажите пожалуйста регулярку для re.split(), с помощью которой можно распилить строку такого типа

:nick!~ident@host PRIVMSG #channel : test message
вот на такой список
['nick', 'ident', 'host', '#channel', 'test message']

★★★★

re.split и пропажа PRIVMSG очень слабо вяжутся. К тому же набор полей фиксирован, чем не устраивает re.match?

anonymous
()
Ответ на: комментарий от anonymous

Шаблоны для групп identifier, hostname, channel нужно уточнить, т.к. я не знаю, какие символы в них разрешены (сейчас просто буквы и числа):

# -*- coding: utf-8 -*-
#!/usr/bin/env python3

import re

irc_pat = re.compile(r"""
  ^\s*:
  # nickname:
  (?P<nickname>
    [a-z_\-\[\]\\^{}|`]
    [a-z0-9\-\[\]\\^{}|`]*
  )
  !~
  # ident:
  (?P<identifier>
    \w+
  )
  @
  # host:
  (?P<hostname>
    \w+
  )
  \ PRIVMSG\      #
  # channel
  (?P<channel>
    \#\w+
  )
  \ : \           #
  # message itself:
  (?P<message>
    .*
  )$
""", re.VERBOSE | re.UNICODE)

text = ":nick!~ident@host PRIVMSG #channel : test message"

match = irc_pat.match(text)

if match:
    print match.groups()
    # or match.group('nickname'), match.group('identifier'), etc
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

Спасибо, работает. А что нужно добавить, чтобы оно кириллицу дергало при наличии такой в нике?

    [A-Za-zА-яа-я_\-\[\]\\^{}|`]
    [A-Za-zА-яа-я0-9\-\[\]\\^{}|`]*
Так?

PaRuSoft ★★★★
() автор топика

Еще можно заюзать pyparsing

AlexVR ★★★★★
()
Ответ на: комментарий от PaRuSoft

У меня работает так:

    [a-zа-яёЁ_\-\[\]\\^{}|`]
    [a-zа-яёЁ0-9\-\[\]\\^{}|`]*

Только я забыл про ключ re.IGNORECASE, который нужно добавить к re.compile

Можно также посмотреть в сторону альтернативных реализаций регулярок под питон, поддерживающих Unicode Properties.

UPD: ещё нужно использовать «юникодные» литералы в случае второго питона:

# -*- coding: utf-8 -*-
#!/usr/bin/env python3

import re

irc_pat = re.compile(ur"""
  ^\s*:
  # nickname:
  (?P<nickname>
    [a-zа-яёЁ_\-\[\]\\^{}|`]
    [a-zа-яёЁ0-9\-\[\]\\^{}|`]*
  )
  !~
  # ident:
  (?P<identifier>
    \w+
  )
  @
  # host:
  (?P<hostname>
    \w+
  )
  \ PRIVMSG\      #
  # channel
  (?P<channel>
    \#\w+
  )
  \ : \           #
  # message itself:
  (?P<message>
    .*
  )$
""", re.VERBOSE | re.UNICODE | re.IGNORECASE)

text = u":ник-с-кириллицей-и-Ё!~ident@host PRIVMSG #channel : test message"

match = irc_pat.match(text)

if match:
    print 'nickname is', match.group('nickname')
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.