0

这与我关于写入 xml 文档的问题有关。我试图从电子邮件文件(txt / html)中读取格式无关紧要,我想知道的是如何查找一个特定的字符串(即我的构建),它永远不会在同一个地方两次并且具有关联我也感兴趣的字符串?顺便说一句,我正在用 python 编写这个脚本。在查找我尝试使用的信息时,我可以提供我所指的电子邮件类型的示例。

我的代码如下:

    with open('Daily Build Email  07012013.txt','r') as x:
      b = 1
      linka = b
      linkm = b
      for line in x:
        print b,' + ',line
        if "Link1" in line:
         linka = line
         string.strip (s[Link1: ])
         print "Link is ", linka
        #else:
        #   continue
        if "Link2" in line:
         linkb = line
         print "Link is ", linkm
        else:
            continue
        b += 1

x.close()

字符串条仅使该行包含 linka 和 linkm 的网络位置,因为在打开的文件中 \ 之前的行中的前导字符我需要删除这些字符,因此这些行仅包含其中的链接。另外,我需要将两个链接都写入另一个文件(build.xml),这样每次我收到新的构建电子邮件时,我就可以使用 build.xml 文件来自动化测试过程。另外,我还需要允许每个电子邮件 msg 进行 2 个或更多构建(目前还不确定)。

4

1 回答 1

0

我认为您的主要问题是您的 string.strip - 我假设您已经在某处的文档中看到了这一点。stringin这个词string.strip并不是字面上的意思,而是要替换为您要剥离的字符串的名称。您正在告诉该字符串(在这种情况下,可能是 linka)从自身中去除前导字符。它需要一个字符列表,而不是一个字符串。它也不会修改字符串本身,而是返回一个新字符串,您可以将其放入同一个变量或另一个变量中。我认为您所追求的更可能是 string.replace(fromstr,tostr) 之类的东西,在这种情况下,linka=linka.replace("Link1: ","")

假设 b 是一个行计数器,你可能不想要那个else: continue- 跳过循环的其余部分,所以 b 不会增加。

此外,您应该阅读正则表达式 - 正则表达式 - 它们非常适合您在这里尝试做的事情。它们有一个陡峭的学习曲线(特别是如果你尝试从实际示例开始,它们一开始可能很难阅读),但非常值得,并且非常适合这样的事情。

我意识到那里可能有调试代码。

我将以上所有内容重写如下:

import re
for line in open('Daily Build Email  07012013.txt','r'):
    match=re.match(r'Link1: (.*)',line)
    if (match):
            linka = match.group(1)

    match=re.match(r'Link2: (.*)',line)
    if (match):
            linkb = match.group(1)

所以主要的不同(除了剥离所有调试代码......)是使用正则表达式 - 使用 module re。指令match=re.match(r'Link1: (.*)',line)是所有魔法发生的地方。Link1: (.*)是要寻找的模式。在模式中,字母通常代表自己 - 它Link1:在字符串的开头搜索(在这种情况下,行首. A single dotcan represent any character, and a*`表示,0或更多。所以括号之间的位表示查找任何数字(包括0 ) 任何字符。正则表达式,除非另有说明,是“贪婪的”——它们尽可能匹配。所以这将匹配到行尾。因为这个位在括号中,它们被分配给一个“组"(稍后会详细介绍)。

所以这个 re.match 将搜索第二个参数(行)并尝试匹配模式。如果找到匹配项,则返回有关该匹配项的信息,否则返回 None。

在下一行,我们说if (match):- 匹配通过了这个测试,没有失败,所以这个代码块只有在匹配时才运行。我们从匹配中得到 group(1) (即第一组[并且仅在这种情况下]括号中的位-“Link1:”之后的信息我们将它放在linka中,嘿!我们完成了!

对 Link2/linkb 重复相同的操作。

然后,继续下一行。

完毕!

于 2013-07-04T02:18:59.780 回答