2011-07-11 30 views
0

我有這個python腳本,它應該包裝所有看起來像標籤內的路徑,使一個URL脫離它。將路徑轉換爲URL的正則表達式

def wrap(text, regex): 
    start, end = '<a href="/static', '">Link to the file</a>' 
    matchs = sorted([(s.start(), s.end()) for s in re.finditer(regex, text)], 
      reverse = True) 
    for match in matchs: 
     text = text[:match[1]] + end + text[match[1]:] 
     text = text[:match[0]] + start + text[match[0]:] 
    return text 

我嘗試了許多組合像這樣的:

>>> wrap('HA HA HA /services/nfs_qa/log.lol HO HO HO', '/services/nfs_qa/.* ??') 
'HA HA HA <a href="/static/services/nfs_qa/log.lol HO HO HO">Link to the file</a>' 

但似乎我不能得到它的權利。所以我可以在那裏使用一點幫助!

在此先感謝

回答

2

這取決於位上的字符,您可以允許路徑名,但這樣做的伎倆爲您例如:

wrap('HA HA HA /services/nfs_qa/log.lol HO HO HO', '/services/nfs_qa/[^ ]*') 
'HA HA HA <a href="/static/services/nfs_qa/log.lol">Link to the file</a> HO HO HO' 

的[^]意味着什麼,但一個空間(與[]相反)。

如果路徑名中允許有任何字符,則不可能。

+0

謝謝!我應該再次搜索python re doc,我想。我會找到這樣的事情。 – jaes

0

您正試圖匹配很多。你只想匹配URL,所以像'/services/nfs_qa/\S+'這樣的RE更適合。在\S+匹配任何非空格字符後/services/nfs_qa/

+0

更正答案。這是貪婪的,但不是我說的最初的方式。 –

1

「。」 mathches每一個角色,你應該匹配,這意味着\S或在這個例子中[^ ]「除空白字符一切」:

wrap('HA HA HA /services/nfs_qa/log.lol HO HO HO', '/services/nfs_qa/\S*') 

而且,你的包裝功能可以寫simplier使用應用re.sub

import re 

def tag_it(match_obj): 
    tags = "<a href =\"/static{0}\">Link to the File</a>" 
    return tags.format(match_obj.group(0)) 

def wrap(text, regex): 
    return re.sub(regex, tag_it, text) 

a = wrap('HA HA HA /services/nfs_qa/log.lol HO HO HO', '/services/nfs_qa/\S*') 
print(a) 
#Outputs: 
#HA HA HA <a href ="/static/services/nfs_qa/log.lol">Link to the File</a> HO HO HO 
相關問題