Regex 如何通过不包含“/”来选择图像URL?

Regex 如何通过不包含“/”来选择图像URL?,regex,python-3.x,pandas,regex-negation,Regex,Python 3.x,Pandas,Regex Negation,我正在尝试找出如何将Series.str.extract图像URL image-image-image.jpg提取到一个新列,但是我在正则表达式方面遇到了问题。我做错了什么 下面是我的数据的外观 我尝试从比赛中排除所有的/并对/进行积极的回顾,因此从那里开始,对>,进行积极的前瞻,但似乎不起作用。我正在使用Regexr和我的Jupyter笔记本,如果问题出在那里的话 这是我的正则表达式代码 r'^?:?!/.$ 在这里,我们可能不想添加开始和结束锚定,我们将从一个简单的表达式开始,例如: "ht

我正在尝试找出如何将Series.str.extract图像URL image-image-image.jpg提取到一个新列,但是我在正则表达式方面遇到了问题。我做错了什么

下面是我的数据的外观

我尝试从比赛中排除所有的/并对/进行积极的回顾,因此从那里开始,对>,进行积极的前瞻,但似乎不起作用。我正在使用Regexr和我的Jupyter笔记本,如果问题出在那里的话

这是我的正则表达式代码
r'^?:?!/.$ 在这里,我们可能不想添加开始和结束锚定,我们将从一个简单的表达式开始,例如:

"https?.+?\.(jpg)"
如果我们希望允许其他扩展,如gif或png,只需使用逻辑or即可:

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

"(https?.+?\.(jpe?g|gif|png))"
测验 正则表达式电路 可视化正则表达式:


更详尽的解决方案:

https?:\/\/[A-z0-9-_.\/%]+\/([A-z0-9-_.%]+?\.(png|jpe?g|png))
这看起来有点吓人,但它有点冗长,而且还支持编码URL。您可以在第一个匹配的组$1中找到图像的名称。

使用

df['col'].str.extractall(r'''/([^/"']*\.jpe?g)"''')
/[^/']*\.jpg模式匹配/,然后在组1中捕获除/、和、.jpg/.jpg以外的任何零个或多个字符,然后仅匹配

请注意,您不需要lookarounds,因为只返回捕获到模式中的组1或任何捕获组中的内容,但这里只有一个捕获组

请参见,结果将仅包含那些绿色高亮显示的部分。另见:

细节

/-a/char [^/']*\.jpe?g-第1组输出:除/、and'和then.jpeg或.jpg以外的任何0+字符 -一个字符。
Try.str.extractallr'/[^/']*\.jpg'谢谢,这正是我所需要的,我添加了一个积极的向前看和向后看,正则表达式非常完美!谢谢你,jex.im是一个很棒的工具!我现在更懂语法了!
"(https?.+?\.(jpe?g|gif|png))"
# 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.
https?:\/\/[A-z0-9-_.\/%]+\/([A-z0-9-_.%]+?\.(png|jpe?g|png))
df['col'].str.extractall(r'''/([^/"']*\.jpe?g)"''')