. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,109 声望值: 4
精华: 13,解答: 23
#1 旧 2018-07-08, 23:02:14 默认 已解答: 【求助】求个网址匹配正则(仅匹配不含协议)
funnyPC 当前离线  

一段文字,网址穿插于各种字符中,不是行首

希望用正则匹配(基于python)替换完成两个任务:
1.希望为其它不含协议的网址添加上 http://
2.网址前后添加空格
添加空格这个需求,对于 goo.gl/VHsUUy7月6日 这样的当然不太好办了,但对7月6日http://goo.gl/VHsUUy 这样的还是可以去做的

效果演示:

代码:
OTHER字符https://goo.gl/VHsUUy其它CHARhttp://goo.gl/VHsUUyOTHER字符goo.gl/VHsUUy其它CHARgoo.gl
替换成
代码:
OTHER字符 https://goo.gl/VHsUUy 其它CHAR http://goo.gl/VHsUUy OTHER字符 http://goo.gl/VHsUUy 其它CHAR http://goo.gl
网址部分没疑问
代码:
([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))
这样应该就够用了

问题是如何仅匹配不含协议的网址并为其添加 http:// 而不影响已有协议的网址,look behind总是会匹配到
代码:
http://goo.gl/VHsUUy 中的 http://goo.gl/VHsUUy
难道只能先
代码:
goo.gl/VHsUUy -> http://goo.gl/VHsUUy
http://goo.gl/VHsUUy -> http://http://goo.gl/VHsUUy
https://goo.gl/VHsUUy -> https://http://goo.gl/VHsUUy
然后再
代码:
http://http:// -> http://
https://http:// -> https://
这样吗?好像太low了 :blush;
回复时引用此帖
最佳解答为:MacOS
还是可行的,这个相对简单些,对于前缀,有这样规则,无前缀的加HTTP,有前缀的前缀不变,前缀上有两种HTTP和HTTPS,差异只是多了个S,就拿这个S做区别,获取的到S的特地取出来加入,不能获取的也加不进去,以你的写法扩充的话,大体是这样
FROM【(http(s?)://)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))】
TO【 http\2://\3 】

如果考虑重复替换的问题就这样
【\s*(http(s?)://)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))\s*】
MacOS
 
MacOS 的头像
热心会员
 
资 料:
注册日期: Aug 2002
帖子: 13,237 声望值: 5
精华: 0,解答: 128
#2 旧 2018-07-10, 10:44:40 默认
MacOS 当前离线  

还是可行的,这个相对简单些,对于前缀,有这样规则,无前缀的加HTTP,有前缀的前缀不变,前缀上有两种HTTP和HTTPS,差异只是多了个S,就拿这个S做区别,获取的到S的特地取出来加入,不能获取的也加不进去,以你的写法扩充的话,大体是这样
FROM【(http(s?)://)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))】
TO【 http\2://\3 】

如果考虑重复替换的问题就这样
【\s*(http(s?)://)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))\s*】


HIDDEN MESSAGE LEVEL 3
14863 159357 789 159357 3245687 3684
回复时引用此帖
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,109 声望值: 4
精华: 13,解答: 23
#3 旧 2018-07-12, 22:18:23 默认
funnyPC 当前离线  

引用:
作者: MacOS 查看帖子
还是可行的,这个相对简单些,对于前缀,有这样规则,无前缀的加HTTP,有前缀的前缀不变,前缀上有两种HTTP和HTTPS,差异只是多了个S,就拿这个S做区别,获取的到S的特地取出来加入,不能获取的也加不进去,以你的写法扩充的话,大体是这样FROM【(http(s?)://)?([-a-zA-Z0-9@:%._\+~#=...
完美!相当服气。

我想解决方案时,总想着区别带不带协议,就是没想到\1以无当有以有当元。
回复时引用此帖
midi
 
midi 的头像
超级会员
 
资 料:
注册日期: Oct 2001
帖子: 1,084 声望值: 3
精华: 5,解答: 34
#4 旧 2018-07-13, 10:11:35 默认
midi 当前离线  

我觉得可以写一个简单的脚本。类似这样:
代码:
import re

sample="""
goo.gl/VHsUUy
http://goo.gl/VHsUUy
https://goo.gl/VHsUUy
"""

url_pattern = r'[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*)'
ur_pattern = r"(https?://{}|{})".format(url_pattern, url_pattern)
output = re.split(ur_pattern, sample)
print ''.join([i if i.startswith('http://') or i.startswith('https://') or i=='\n' else 'http://'+i for i in output])
思路就是:将输入先按照网址(带http(s),或者不带的)分开;然后不带的加上http://;最后合并起来。输出就是:

代码:

http://goo.gl/VHsUUy
http://goo.gl/VHsUUy
https://goo.gl/VHsUUy
回复时引用此帖
发表新主题 回复

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 21:31:38.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号