2011-07-11 29 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 
相关问题