这与我关于写入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文件自动执行测试过程。另外,我还需要为每封电子邮件消息允许2个或更多版本(目前还不确定)。
答案 0 :(得分:0)
我认为你的主要问题是你的string.strip - 我假设你已经在某个地方的文档中看到过。 string
中的单词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)
因此,除了剥离所有调试代码之外,主要的不同之处在于使用正则表达式 - 使用模块re
。指令match=re.match(r'Link1: (.*)',line)
是所有魔法发生的地方。 Link1: (.*)
是要寻找的模式。在模式中,字母通常代表自己 - 它在字符串的开头搜索Link1:
(在这种情况下,行. A single dot
的开头。can represent any character, and a
*`表示,0或更多所以括号之间的位表示查找任何字符的任何数字(包括0)。正则表达式,除非另有说明,是“贪婪” - 它们尽可能匹配。所以这将匹配到行的结尾因为这个位在括号中,所以它们被分配给一个“组”(稍后会详细介绍)。
所以这个re.match将搜索第二个参数(line)并尝试匹配模式。如果找到匹配项,则返回有关该匹配项的信息,否则返回None。
在下一行,我们说if (match):
- 匹配通过此测试,无失败,因此只有匹配时才会运行此代码块。我们从匹配中得到group(1)(即第一个[在这种情况下只有]括号中的位 - “Link1:”之后的信息我们把它放在linka中,嘿!我们已经完成了!
对Link2 / linkb重复相同的操作。
然后,继续下一行。
完成!