-1

http または // または \ を含み、見つかったら href タグで囲むリンクを見つけようとしていますが、これを行う方法について何かアイデアはありますか

 INput:-http://pastebin.com/p9H8GQt4

sanity_results = sanity_results.replace('\n','<br>\n')
return sanity_results

def main ():
resultslis=[]
xmlfile = open('results.xml','r')
contents = xmlfile.read()
testresults=getsanityresults(contents)
#print testresults
for line in testresults:
    #print line
    line = line.strip()
    #print line
    line = re.sub(r'(http://[^\s]+|//[^\s]+|\\\\[^\s]+)', r'<a href="\1">\1</a>', line)
    print line       
    resultslis.append(line)
print resultslis

if __name__ == '__main__':
main()
4

2 に答える 2

2

これには正規表現を使用することをお勧めします。

line = re.sub(r'(http://[^\s]+)', r'<a href>\1</a>', line)

それはちょうどhttp://ケースを処理します。3 つすべてを処理するには、次のようにします。

line = re.sub(r'(http://[^\s]+|//[^\s]+|\\\\[^\s]+)', r'<a href>\1</a>', line)

コンソールでその正規表現を試して、希望どおりに動作することを確認しますが、投稿された入力データで要求したとおりに動作するようです。コメントで述べたように、一般に、テキストを自動リンクする場合は、リンクを終了できる区切り文字を理解する必要があります。

一方、問題の仕様は正しいですか? 通常、これは必要ありません。

<a href>http://foo/bar</a>

… でもこれは:

<a href="http://foo/bar">http://foo/bar</a>

それを取得するには、sub置換式を に変更するだけr'<a href="\1">\1</a>'です。

文字列関数を使って全体を書くこともできますが、単純なケース以外では、実際には正規表現を学ぶよりもはるかに難しいことがわかります. たとえば、上記のワンライナーに相当するものは次のようなものです。

index = 0
while index is not None:
    index = min(line.find(pattern, index) for pattern in ('http:', '//', '\\\\'))
    if index == -1:
        break
    space = line.find(' ', index)
    if space == -1:
        space = None
    line = line[:index] + '<a href>' + line[index:space] + '</a>' + line[space:]
    index = space

ただし、少なくとも 1 つの明らかなフェンスポスト エラーがあり、パターンが重複している可能性のある微妙なバグが少なくとも 1 つあります。

于 2012-11-20T01:54:59.200 に答える
0

文字列エスケープ シーケンス文字列操作に関するドキュメントを読む必要があります。

if (line.find('http') != -1 or line.find('\\\\') != -1 or line.find('//') != -1):
    line = '<a href="">'+line+'</a>'
于 2012-11-20T01:36:54.963 に答える