如何通过不包含“ /”来选择图片网址?

时间:2019-06-04 21:28:18

标签: regex python-3.x pandas regex-negation

我试图弄清楚如何将Series.str.extract()图像Urls(image-image-image.jpg)移至新列,但是Regex出现了问题。我在做什么错了?

这是我的数据外观

<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 Notebook。

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

我希望正则表达式匹配为 image-image.image.jpg image2-image2.image2.jpg ,但不匹配任何内容。

已解决的正则代码

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

3 个答案:

答案 0 :(得分:2)

更详尽的解决方案:

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

这似乎有点吓人,但它有点冗长,并且也支持编码的URL。您可以在第一个匹配的组($ 1)中找到图像的名称。

答案 1 :(得分:0)

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

"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.

RegEx电路

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

enter image description here

答案 2 :(得分:0)

使用

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

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

请注意,您不需要环顾四周,因为pandas.Series.str.extractall仅返回捕获到第1组(或模式中的任何捕获组,但是这里只有1个捕获组)的对象。

请参见regex demo,结果将仅包含那些绿色突出显示的部分。另请参见regex graph

enter image description here

详细信息

  • "-一个/字符
  • /-第1组(输出):除([^/"']*\.jpe?g)/"之外,再依次为'或{{1 }}
  • .jpeg-一个.jpg字符。