0

我正在编写我的第一个脚本并尝试学习 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”,这将不起作用。

目前我得到的结果是:

这是测试

因为它正在查找列表中第一个“E”的索引并删除索引+3 之后的所有内容

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

但我似乎无法找到如何。

谢谢大家的回答。我正朝着另一个方向前进,但它也不起作用。如果有人能明白为什么会很棒。边做边学要好得多,然后只是应付别人写的东西:)

这就是我想出的:

对于 l 中的 i:

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

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

太感谢了

4

4 回答 4

2

你听说过正则表达式吗?

查看 python 的re模块。链接到 Docs

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

之后,我只需使用 python 的“切片表示法”来选择您想要保留的字符串。

然后,检查用于将句点交换为空格的字符串方法,并将它们放入 Title Casestr.replacestr.title

于 2013-10-21T22:19:00.337 回答
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
于 2013-10-21T22:18:47.947 回答
0

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

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

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

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

在不知不觉中,您将成为超级英雄。:-)

于 2013-10-21T22:48:05.633 回答
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,这会出错。

于 2013-10-21T22:54:52.647 回答