IndexError:列表索引超出范围;拆分可能导致问题

时间:2013-05-30 10:27:45

标签: python

我只是两天的Python和本论坛。如果我的问题看起来很傻,请承担。我尝试搜索堆栈溢出,但无法关联已给出的信息。

请帮我解决这个问题

   >>> import re
   >>> file=open("shortcuts","r")
   >>> for i in file:
   ...  i=i.split(' ',2)
   ...  if i[1] == '^/giftfordad$':
   ...   print i[1]
   ...
   ^/giftfordad$
   Traceback (most recent call last):
   File "<stdin>", line 3, in <module>
   IndexError: list index out of range

我收到了我的欲望输出,但随着列表索引超出范围错误。 我的文件快捷方式包含四个用SPACE分隔的列。

如果值存在于变量中,请帮助我如何找到模式。 例如

var1=giftcard

如何在我的文件中找到^/var$。提前感谢您的帮助。

从Jon的观点来看,我到达了这一点。但仍在寻找答案。下面给我一个空洞的结果。需要在[^ /和$]

的正则表达式中进行一些调整
    >>> import re
    >>> with open('shortcut','r') as fin:
    ...  lines =  (line for line in fin if line.strip() and not line.strip().startswith('#'))
    ...  for line in lines:
    ...   if re.match("^/giftfordad$",line):
    ...    print line

从我的shell命令,我很容易得到答案。有人可以编写/更正这段代码实现结果,我正在寻找。非常感谢

    $grep "\^\/giftfordad\\$" shortcut
    RewriteRule ^/giftfordad$ /home/sathya/?id=456 [R,L]

2 个答案:

答案 0 :(得分:1)

在此:

i=i.split(' ',2)
if i[1] == '^/giftfordad$':

这意味着i现在是一个长度为1的列表(即,没有''字符可以拆分)。

此外,看起来您可能正在尝试使用正则表达式而if i[1] == '^/giftfordad$'不是Python那样做的方式。该比较将写为:

if i[1] == '/giftfordad':

但是,如果您从正则表达式列表的文件中抓取它,那么这是一个完全有效的字符串;)

刚见过你的例子:

如果你正在处理一个.htaccess类似的文件,你会想要忽略空行和大概注释的行......

with open('shortcuts') as fin:
    lines =  (line for line in fin if line.strip() and not line.strip().startswith('#'))
    for line in lines:
        stuff = line.split(' ', 2)
        # etc...

答案 1 :(得分:0)

我把你给出的那一行作为一个例子,这就是我发现的,希望这符合你的期望(我知道你想在第2列中用^/tv$替换^/giftfordad$:< / p>

>>> s = 'RewriteRule ^/tv$ /home/sathya?id=123 [R=301,L]'
>>> parts = s.split()
>>> parts
['RewriteRule', '^/tv$', '/home/sathya?id=123', '[R=301,L]']
>>> if len(parts) > 1:
    part = parts[1]
    if not "^/giftfordad$" in part:
        print ' '.join([parts[0]] + ["^/giftfordad$"] +  parts[2:])
    else:
        print s    

RewriteRule ^/giftfordad$ /home/sathya?id=123 [R=301,L]

join的行是最复杂的:我通过连接重新创建列表:

  • 第1列未更改
  • 第二列替换为^/giftfordad$
  • 其他列未更改
然后使用

join将所有这些元素作为字符串连接。