我试图弄清楚如何将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)(?=\"\>)"'''
答案 0 :(得分:2)
更详尽的解决方案:
https?:\/\/[A-z0-9-_.\/%]+\/([A-z0-9-_.%]+?\.(png|jpe?g|png))
这似乎有点吓人,但它有点冗长,并且也支持编码的URL。您可以在第一个匹配的组($ 1)中找到图像的名称。
答案 1 :(得分:0)
在这里,我们可能不希望添加开始和结束锚,我们将以一个简单的表达式开始,例如:
"https?.+?\.(jpg)"
如果我们希望允许其他扩展名,例如gif
或png
,我们可以使用逻辑OR |
来简单地这样做:
"https?.+?\.(jpe?g|gif|png)"
如果我们想捕获我们的URL,只需添加一个捕获组:
"(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.
jex.im可视化正则表达式:
答案 2 :(得分:0)
使用
df['col'].str.extractall(r'''/([^/"']*\.jpe?g)"''')
/([^/"']*\.jpg)"
模式与/
匹配,然后将除/
,"
和'
以外的任何零个或多个字符组成的组1中捕获,然后将{{ 1}} / .jpg
,然后匹配.jpeg
。
请注意,您不需要环顾四周,因为pandas.Series.str.extractall
仅返回捕获到第1组(或模式中的任何捕获组,但是这里只有1个捕获组)的对象。
请参见regex demo,结果将仅包含那些绿色突出显示的部分。另请参见regex graph:
详细信息
"
-一个/
字符/
-第1组(输出):除([^/"']*\.jpe?g)
,/
和"
之外,再依次为'
或{{1 }} .jpeg
-一个.jpg
字符。