2012-11-20 15 views
-1

我試圖找到一個鏈接,其中包含http或//或\以及包含href標記的環繞一旦找到它,是否有人有任何想法如何可以做到這一點在一個字符串中查找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() 
+0

您的縮進被搞砸了。我會猜測如何解決這個問題,但請仔細檢查一下,確保我已經正確(並且將來可以正確地粘貼東西)。 – abarnert

+0

[與數據鏈接相關的問題](http://stackoverflow.com/questions/13464962/parsing-the-xml-file-to-create-hyperlinks)(我讓OP將他們的兩個問題分成兩部分,這是第二部分)。 –

+0

鏈接是否是整條線(剝離後)?如果不是,他們如何劃定?如果您嘗試以純文本格式自動鏈接,則規則會變得非常棘手:http://example.com,http://example.com? http://example.com?var=val。 – abarnert

回答

2

您可能需要使用regular expressions此:

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

這只是處理http://情況。爲了處理所有三個,只是這樣做:

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

播放與在控制檯正則表達式,以確保它你想要做什麼,但似乎做你的要求與your posted input data。正如我在評論中提到的那樣,一般來說,如果要自動鏈接文本,您需要確定分隔符可以結束鏈接。

同時,你確定問題規格是否正確?通常情況下,你不希望這樣的:

<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 

除了我敢打賭,我在那裏得到了至少一個明顯的柵欄柱的錯誤,並有可能至少一個微妙可能重疊模式的錯誤,等等。

+0

我試過了,但我沒有得到上面提供的輸入所需的輸出。每一個字母越來越stripped.and輸出lis lik ['8','9','6','0',':', '<','b','r','>','','','','','','\\',..... – user1795998

+0

@ user1795998:您的問題顯然是你正在迭代一個字符串而不是一串字符串。這意味着要麼你正在爲f.read():中的行而不是'for in line in f:',或者你不小心放入了兩個循環,例如'for thingy in f:'then'對於thingy行:'。 – abarnert

0

你應該閱讀string escape sequencesstring operations的文檔。

if (line.find('http') != -1 or line.find('\\\\') != -1 or line.find('//') != -1): 
    line = '<a href="">'+line+'</a>' 
+0

這將圍繞'href'標籤中的整行,而不僅僅是鏈接。 – abarnert

+0

他在某些時候發佈了一個示例數據的鏈接 - 他的數據是這樣的,每個鏈接完全在自己的行,所以這將工作。 –

+0

查看來自其他問題的鏈接(http://pastebin.com/p9H8GQt4),這看起來並不正確。例如,在第11行,有'8960:http://ajm/ATMWebApp/JobRunResults/Default.aspx?JobRunID = 8509752'。 – abarnert

相關問題