Не удается сопоставить регулярное выражение с re.search на Twisted Framework ircbot

Начну с «Я не знаком с Python». Я пытаюсь изменить сценарий ircbot по умолчанию с Twisted для своего канала, но не могу заставить работать re.match или re.search.

Например, это работает:

prompt = ("%s" % self.nickname)
prompt1 = ("%s:" % self.nickname)
prompt2 = ("%s," % self.nickname)

if msg == (prompt1 + " whoareyou?") or msg == (prompt2 + " who are you?") or msg == (prompt1 + " whoareyou") or msg == (prompt2 + " who are you"):

Этот тоже

if msg == (prompt1 + " help") or msg == (prompt2 + " help"):

Однако эти два условия не работают на боте (но работают на локальном скрипте):

if re.search(r'%s[:,] help' % self.nickname, msg):

elif re.search(r'%s[:,] who ?are ?you?' % self.nickname, msg):

Предыдущую версию скрипта, не использующую re.search, можно найти здесь


person victorbrca    schedule 12.11.2014    source источник


Ответы (1)


Я нашел причину проблемы. Twisted включил логику для обработки коллизии никнеймов для бота. Он добавляет ^ в конце имени:

# For fun, override the method that determines how a nickname is changed on
# collisions. The default method appends an underscore.
def alterCollidedNick(self, nickname):
    """
    Generate an altered version of a nickname that caused a collision in an
    effort to create an unused related name for subsequent registration.
    """
    return nickname + '^'

Из-за этого ник моего бота заканчивался на nickname^, а поскольку я использовал %s, чтобы добавить переменную никнейма как часть регулярного выражения, он интерпретировал ^ как модификатор.

if re.search(r'%s[:,] help' % self.nickname, msg):

К этому:

if re.search(r'nickname^[:,] help', msg):
person victorbrca    schedule 13.11.2014