在python中使用字符串

时间:2011-04-18 20:27:09

标签: python string irc

   elif data.find('PRIVMSG') != -1: 
       message = ':'.join(data.split (':')[2:]) 
       if message.lower().find('code') == -1: 
         nick = data.split('!')[ 0 ].replace(':',' ') 
         destination = ''.join (data.split(':')[:2]).split (' ')[-2] 
         function = message.split( )[0] 
         print nick + ' : ' + function
         arg = data.split( )   

         args = '' 
         for index,item in enumerate(arg) : 
              if index > 3 : 
                  if args == '': 
                      args = item 
                  else : 
                          args += ' ' + item 


 if data.find('.topic') != -1:
     nick = data.split('!')[ 0 ].replace(':','')
     for line in open('masters.txt'):
         if nick in line:
            sck.send('TOPIC ' + " " + chan + " " + args + '\r\n')

当我尝试执行类似.topic 1 2 3 4 5 6 7 8 9 10之类的操作时,它会将频道主题更改为3 4 5 6 7 8 9 10而不是整个1 2 3 4 5 6 7 8 9 10我想知道为什么从3开始字符串而不是从头开始?我是否需要从字符串中拆分或剥离某些内容?

3 个答案:

答案 0 :(得分:2)

这是显示问题的最小示例:

     data = ".topic 1 2 3 4 5 6 7 8 9 10"
     arg = data.split()
     args = ''
     for index,item in enumerate(arg):
          if index > 3:
              if args == '':
                  args = item
              else:
                  args += ' ' + item
     print args

这完全归功于if index > 3:

答案 1 :(得分:0)

我想知道为什么它从第3个字符串开始而不是从头开始?

因为这就是你告诉它的事情。 enumerate()函数从0开始索引,因此索引0对应于字符串'topic',索引1对应于字符串'1',依此类推。因此,当您使用条件if index > 3时,它将忽略前四个字符串(索引为0,1,2和3的字符串,在您的情况下为字符串'topic''1''2''3')。

首先,我们可以大大简化循环到以下单行:

args = ' '.join(arg[4:])

也就是说,将arg列表切片以从第四个条目开始获取所有条目,然后使用join()函数将其连接成由字符' '分隔的字符串。

其次,如果您只想删除第一个条目并将其余条目连接到字符串中,只需将索引更改为1:

args = ' '.join(arg[1:])

如果不同的命令需要以不同的方式处理arg列表,那么您需要根据具体情况而不是在一个地方执行此操作:

arg = data.split()

if '.topic' in data:
    nick = data.split('!')[ 0 ].replace(':','')
    topic = ' '.join(arg[1:])
    for line in open('masters.txt'):
        if nick in line:
            sck.send('TOPIC %s %s\r\n' % (chan, topic))

elif '.bannick' in data:
    nick_to_ban = arg[0]
    length = arg[1]
    reason = ' '.join(arg[2:])
    for line in open('masters.txt'):
        if nick in line:
            sck.send('BAN %s %s %s %s\r\n' % (chan, nick_to_ban, length, reason))

答案 2 :(得分:0)

我修复了代码中的错误。

  if data.find('.topic') != -1:
     nick = data.split('!')[ 0 ].replace(':','')
     for line in open('masters.txt'):
         if nick in line:
            sck.send('TOPIC ' + " " + chan + " :" + args + '\r\n')

这个有效,我需要在声明通道变量后添加" :",以便它可以正确读取数据。