darchir 发表于 2022-4-2 08:17:24

正则表达式提取链接

# 使用正则将一个网页中图片链接提取出来
import re

s = '<img src="https://hao2.qhimg.com/t0133f25778df020d4e.gif" width="218" />'

pattern = '<img src=/.*?\.gif|png|jpg'

result = re.search(pattern, s)
print(result)


各位大佬, 为啥我正则怎么试, 出来的结果都是下面这个结果?缺几位? 是不是我的正则写的有问题?
还有个问题, 用正则里面的或操作符'|', 怎么界定或操作的位数? 譬如上面的例子, 如何确保是'gif' , 'png', 'jpg' 的或操作, 而不是 'f' 和 'p', 'g' 和 'j'的或操作, 是要加括号分组吗?

感谢!!!

<re.Match object; span=(0, 56), match='<img src="https://hao2.qhimg.com/t0133f25778df020>

isdkz 发表于 2022-4-2 17:03:45


第一个问题:

用 search 得到的是一个 Match 对象,你要看匹配到的字符串得使用 Mathc 对象的 group 方法

第二个问题:

你不是用分组的话,或操作是对所有字符的,比如你的'<img src=/.*?\.gif|png|jpg' 相当于

要么匹配 <img src=/.*?\.gif,要么匹配 png,要么匹配 jpg,

你想限定或操作的范围,只能用分组,分组也可以不保存的(加个 ?:)
import re

s = '<img src="https://hao2.qhimg.com/t0133f25778df020d4e.gif" width="218" />'

pattern = r'<img src="([^"]*(?:gif|png|jpg))"'

result = re.search(pattern, s).group(1)
print(result)

阿奇_o 发表于 2022-4-2 17:56:53

都是固定在src="...."里的,所以加个括号,即可。 完全不用判断图片类型,除非你真的要找特定格式的图片。。
re.findall('<img src="(.*)" width="218" />', s)# 返回的是列表哦

darchir 发表于 2022-4-3 11:09:16

isdkz 发表于 2022-4-2 17:03
第一个问题:

用 search 得到的是一个 Match 对象,你要看匹配到的字符串得使用 Mathc 对象的 group...

再请教一下, [^"]是个神马神仙操作?

darchir 发表于 2022-4-3 11:10:19

阿奇_o 发表于 2022-4-2 17:56
都是固定在src="...."里的,所以加个括号,即可。 完全不用判断图片类型,除非你真的要找特定格式的图片。 ...

感谢! 简单实用{:10_266:}

isdkz 发表于 2022-4-3 11:32:17

darchir 发表于 2022-4-3 11:09
再请教一下, [^"]是个神马神仙操作?

非双引号的任意字符

darchir 发表于 2022-4-3 11:41:47

isdkz 发表于 2022-4-3 11:32
非双引号的任意字符

受教匪浅

darchir 发表于 2022-4-3 11:44:07

isdkz 发表于 2022-4-3 11:32
非双引号的任意字符

大佬, 再教我一下, 为啥不用小括号, 而是用方括号?{:10_302:}

isdkz 发表于 2022-4-3 11:46:52

darchir 发表于 2022-4-3 11:44
大佬, 再教我一下, 为啥不用小括号, 而是用方括号?

小括号是分组,中括号才是匹配中括号的任意字符,

中括号里面加个 ^ 就是匹配非中括号里面的内容,

我排除引号是因为,直接用 . 匹配任意字符的话,

贪婪匹配可能会匹配到不在同一个标签里面的

darchir 发表于 2022-4-3 11:55:17

isdkz 发表于 2022-4-3 11:46
小括号是分组,中括号才是匹配中括号的任意字符,

中括号里面加个 ^ 就是匹配非中括号里面的内容,
...

牛×!
页: [1]
查看完整版本: 正则表达式提取链接