如果存在字符串组合,则在python中查找列表中的索引

时间:2013-10-21 22:07:58

标签: python string

我正在编写我的第一个脚本并尝试学习python。 但是我被困住了,无法摆脱这一个。

我正在编写一个脚本来更改文件名。

假设我有string = "this.is.tEst3.E00.erfeh.ervwer.vwtrt.rvwrv"

我希望结果为string = "This Is Test3 E00"

这是我到目前为止所做的:

l = list(string) 

//Transform the string into list

for i in l:
    if "E" in l:
        p = l.index("E")
        if isinstance((p+1), int () is True:
            if isinstance((p+2), int () is True:
                delp = p+3
                a = p-3
                del l[delp:]

new = "".join(l)
new = new.replace("."," ")
print (new)

进入索引“E”并检查“E”后是否有2个整数。 然后删除第二个整数后的所有内容。

但是,如果其他任何地方都有“E”,这将无效。

目前得到的结果是:

  

这是tEst

因为它正在查找列表中第一个“E”的索引并删除index + 3

之后的所有内容

我想我的问题是如果存在字符串组合,如何在列表中获取索引。

但我似乎无法找到。

感谢大家的回答。 我正朝着其他方向前进,但它也没有用。 如果有人能够理解为什么它会很棒。通过这样做来学习其他人写的东西要好得多:)

这就是我提出的:

  

for i in l:

if i=="E" and isinstance((i+1), int ) is True:
    p = l.index(i)
    print (p)

任何人都可以告诉我为什么这不起作用。我收到了错误。

非常感谢

4 个答案:

答案 0 :(得分:2)

你听说过正则表达吗?

查看python的re模块。 Link to the Docs

基本上,您可以定义一个匹配“E然后两个整数”的“正则表达式”,并为其提供索引。

之后,我只使用python的“Slice Notation”来选择你想要保留的字符串。

然后,查看str.replace的{​​{3}}以换取空格的句点,并str.title将它们放入标题案例中

答案 1 :(得分:1)

一种简单的方法是使用正则表达式查找E后跟2位数条件,s作为字符串:

import re
up_until = re.match('(.*?E\d{2})', s).group(1)
# this.is.tEst3.E00

然后,我们用空格替换.,然后标题为:

output = up_until.replace('.', ' ').title()
# This Is Test3 E00

答案 2 :(得分:0)

要考虑使用的技术是正则表达式。它们允许您在字符串中搜索文本模式,而不是特定字符或子字符串。正则表达式有一个艰难的学习曲线,但是学习非常宝贵,你可以在许多语言中使用它们,而不仅仅是在Python中。以下是正则表达式实现方式的Python资源:

http://docs.python.org/2/library/re.html

您希望在您的案例中匹配的模式是“E”后跟两位数。在正则表达式(通常缩写为“正则表达式”或“正则表达式”)中,该模式如下所示:

E\d\d # ('\d' is the specifier for any digit 0-9)

在Python中,您创建了一个要匹配的正则表达式模式的字符串,并将该文件名字符串传递给re模块的search()方法。正则表达式模式倾向于使用许多特殊字符,因此在Python中常见的是使用'r'添加正则表达式模式字符串,这告诉Python解释器不要将特殊字符解释为转义字符。所有这些都是这样的:

import re
filename = 'this.is.tEst3.E00.erfeh.ervwer.vwtrt.rvwrv'
match_object = re.search(r'E\d\d', filename)
if match_object:
    # The '0' means we want the first match found
    index_of_Exx = match_object.end(0)
    truncated_filename = filename[:index_of_Exx]
    # Now take care of any more processing

正则表达式可以非常详细(和复杂)。实际上,您可以使用正确放置在一起的单个正则表达式来完成完全更改文件名的整个任务。但是由于我不知道有关您的程序可能会出现什么类型的奇怪文件名的详细信息,我不能再这样了。我将添加一条信息:如果'E'可能是小写的,那么你想在模式搜索中添加一个标志作为第三个参数,表示不区分大小写的匹配。那个标志是're.I',你的search()方法看起来像这样:

match_object = re.search(r'E\d\d', filename, re.I)

阅读有关Python're'模块的文档以获取更多信息,您可以在线找到许多优秀的教程,例如:

http://www.zytrax.com/tech/web/regex.htm

在你知道它之前,你将成为superhero。 : - )

答案 3 :(得分:0)

这不起作用的原因:

for i in l:

    if i=="E" and isinstance((i+1), int ) is True:
        p = l.index(i)
        print (p)

...是因为'i'包含字符串'l'中的字符,而不是整数。你将它与'E'(有效)进行比较,但是然后尝试向它添加1,这会导致错误。