0

これは、xml ドキュメントへの書き込みに関する私の質問に関連しています。電子メール ファイル (txt/html) から読み取ろうとしていますが、形式は問題ではありません。知りたいのは、同じ場所に 2 度となく、関連付けられている特定の文字列 (つまり、ビルド) を探す方法です。文字列も私に興味がありますか?ところで、私はこのスクリプトを 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 つ以上のビルドを許可する必要もあります (これについてはまだわかりません)。

4

1 に答える 1

0

あなたの主な問題は string.strip だと思います-どこかのドキュメントでそれを見たことがあると思います。stringinという単語string.stripは文字通りそこにあることを意図したものではなく、削除したい文字列の名前に置き換えることを意図しています。その文字列 (この場合はおそらく linka) に、それ自体から先頭の文字を削除するように指示しています。文字列ではなく、文字のリストを取ります。また、文字列自体は変更しませんが、同じ変数または別の変数に入れることができる新しい文字列を返します。あなたが求めているのは、この場合、string.replace(fromstr,tostr) のようなものである可能性が高いと思います。linka=linka.replace("Link1: ","")

b が行カウンターであると仮定すると、おそらくelse: continueどちらも必要ありません。これはループの残りをスキップするため、 b はインクリメントされません。

また、正規表現 (regex) についても読む必要があります。これらは、ここでやろうとしていることに最適です。それらは急な学習曲線を持っています (特に実際の例から始めようとすると、最初は非常に読みにくい場合があります) が、十分に価値があり、このようなものに最適です。

おそらくデバッグコードがそこにあることに気づきました。

上記のすべてを次のように書き直します。

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

したがって、この re.match は 2 番目のパラメーター (行) を検索し、パターンの一致を試みます。一致が見つかった場合は、その一致に関する情報を返します。そうでない場合は、None を返します。

次の行では、if (match):一致はこのテストに合格し、どれも失敗しないため、このコード ブロックは一致があった場合にのみ実行されます。一致から group(1) を取得します (つまり、最初の [そしてこの場合のみ] 括弧のセットのビット - "Link1: " の後の情報) それを linka に入れます。 !

Link2/linkb についても同じことを繰り返します。

次に、次の行に進みます。

終わり!

于 2013-07-04T02:18:59.780 に答える