如何通过不包含“/”来 select 图片 URL?

How to select Image URL by not including "/"?

我正在尝试弄清楚如何 Series.str.extract() 图像 Urls (image-image-image.jpg) 到新列,但我遇到了正则表达式问题。我做错了什么?

这是我的数据的样子

<a href="https://website.com/wp-content/uploads/2018/09/image-image.image.jpg"><img class="alignnone size-medium wp-image-11275" src="https://website.com/wp-content/uploads/2018/09/image-image.image-300x200.jpg" alt="" width="300" height="200" /></a> <a href="https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg"><img class="alignnone size-medium wp-image-11271" src="https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg-300x200.jpg" alt="" width="300" height="200" />

我试过从匹配项中排除所有“/”,并对“/”进行正面回顾,因此它从那里开始,对“”>”进行正面回顾,但它似乎不起作用。如果问题来自那里,我正在使用 Regexr 和我的 Jupyter 笔记本。

这是我的正则表达式代码 r'^(?:(?!/).)$(?<=/)(..jpg)(?=\">)'

我预计正则表达式匹配为 image-image.image.jpgimage2-image2.image2.jpg 但它不匹配任何内容。

已解决正则表达式代码

r'''(?<=/)([^/"']*\.jpe?g)(?=\"\>)"'''

在这里,我们可能不想添加开始和结束锚点,我们将从一个简单的表达式开始,例如:

"https?.+?\.(jpg)"

如果我们希望允许其他扩展,例如 gifpng,我们可以简单地使用逻辑 OR |:

"https?.+?\.(jpe?g|gif|png)"

如果我们希望捕获我们的 URL,我们只需添加一个捕获组:

"(https?.+?\.(jpe?g|gif|png))"

Demo

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\"(https?.+?\.(jpe?g|gif|png))\""

test_str = "<a href=\"https://website.com/wp-content/uploads/2018/09/image-image.image.jpg\"><img class=\"alignnone size-medium wp-image-11275\" src=\"https://website.com/wp-content/uploads/2018/09/image-image.image-300x200.jpg\" alt=\"\" width=\"300\" height=\"200\" /></a> <a href=\"https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg\"><img class=\"alignnone size-medium wp-image-11271\" src=\"https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg-300x200.jpg\" alt=\"\" width=\"300\" height=\"200\" />
"

matches = re.finditer(regex, test_str, re.MULTILINE | re.IGNORECASE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

正则表达式电路

jex.im 可视化正则表达式:

更详尽的解决方案:

https?:\/\/[A-z0-9-_.\/%]+\/([A-z0-9-_.%]+?\.(png|jpe?g|png))

看起来有点吓人,但它有点冗长,而且也支持编码的 URL。您可以在第一个匹配组 ($1) 中找到您的图片名称。

使用

df['col'].str.extractall(r'''/([^/"']*\.jpe?g)"''')

/([^/"']*\.jpg)" 模式匹配 /,然后将除 /"' 之外的任何零个或多个字符捕获到第 1 组中,然后.jpg / .jpeg 然后匹配 ".

请注意,您不需要环顾四周,因为 pandas.Series.str.extractall 只有 returns 捕获到第 1 组(或模式中的任何捕获组,但此处只有 1 个捕获组)的内容。

参见regex demo, the result will only contain those green-highlighted parts. See also the regex graph

详情

  • / - 一个 / 字符
  • ([^/"']*\.jpe?g) - 第 1 组(输出):除 /"' 之外的任何 0+ 个字符,然后是 .jpeg.jpg
  • " - 一个 " 字符。