1

我为 XMPP 服务器创建了一个禁止机器人,这是我脚本的一部分:

resources = ['private', 'sergeant', 'staffsergeant']

"""presence detection script here"""
if resource in resources:
    pass
else:
    print "the jid has been banned"
    """ban script here"""

所以上面的代码禁止任何用户进入,除非他们的资源是private,sergeantstaffsergeant.

我想将上面的脚本更改为禁止任何上述资源,当且仅当它们在资源名称后有一个整数(例如:sergeant343private5654等),但如果它们没有任何整数,则禁止它们。所以jid/sergeant被禁止但jid/sergeant432通过。整数可以是 中的任何数字range(0, 99999)。我怎样才能做到这一点?

4

4 回答 4

1

解决方案如下所示:

if resource.rstrip('0123456789') in resources:
    if resource != resource.rstrip('0123456789'):
        print 'ok'
    else:
        print 'banned'
else:
    raise NotImplementedError()  # replace with own code
于 2012-05-13T22:29:03.387 回答
1

您可以使用正则表达式。

if not re.match(u'^(' + u'|'.join(resources) + u')\d+$', string):
  # Ban here.
于 2012-05-13T22:38:17.907 回答
0

这是你想要的?

import random as rn

my_string = 'string'

new_string = my_string + str(rn.randint(0,99999))

结果:

>>> new_string
'string32566'
于 2012-05-13T22:16:54.257 回答
0

你想用类似的东西做什么sergeant00432

这样的事情怎么样?

allowed_prefixes = ['private', 'sergeant', 'staffsergeant']

def resource_is_allowed(r):
    for prefix in allowed_prefixes:
        if re.match(prefix + '[0-9]{,5}', r):
            return True
    return False

或者,更简洁但可能不太清楚,

def resource_is_allowed(r):
    return any(re.match(prefix + '[0-9]{,5}', r) for prefix in allowed_prefixes)

请注意,这些将前缀视为正则表达式。您指定的特定前缀与 RE 具有相同的含义,就像它们作为纯字符串一样;如果您可能开始允许在 RE 中包含具有特殊含义的字符的资源前缀,则需要更加谨慎。

于 2012-05-13T22:23:17.287 回答