如何通过不包含“/”来 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.jpg 和 image2-image2.image2.jpg 但它不匹配任何内容。
已解决正则表达式代码
r'''(?<=/)([^/"']*\.jpe?g)(?=\"\>)"'''
在这里,我们可能不想添加开始和结束锚点,我们将从一个简单的表达式开始,例如:
"https?.+?\.(jpg)"
如果我们希望允许其他扩展,例如 gif
或 png
,我们可以简单地使用逻辑 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
"
- 一个 "
字符。
我正在尝试弄清楚如何 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.jpg 和 image2-image2.image2.jpg 但它不匹配任何内容。
已解决正则表达式代码
r'''(?<=/)([^/"']*\.jpe?g)(?=\"\>)"'''
在这里,我们可能不想添加开始和结束锚点,我们将从一个简单的表达式开始,例如:
"https?.+?\.(jpg)"
如果我们希望允许其他扩展,例如 gif
或 png
,我们可以简单地使用逻辑 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
"
- 一个"
字符。