gpt4 book ai didi

python - 查找 Markdown 代码块之外的图像标签

转载 作者:行者123 更新时间:2023-12-01 09:13:30 29 4
gpt4 key购买 nike

简介

我有几百个包含代码块的 Markdown 文件,它们看起来像这样。

```html
<img src="fil.png">
```

- [ ] Here is another image <img src="fil.png"> and another `<img src="fil.png">`

```html
<a href="scratch/index.html" id="scratch" data-original-title="" title="" aria-describedby="popover162945">
<div class="logo-wrapper">
</div>
<div class="name">
<span>Scratch</span>
</div>
<img src="fil.png">
</a>
```

我的目标是找到代码块之外的所有没有alt标签的IMG标签

不确定我是否可以使用 HTML: 解析器,因为代码块......

示例

我并不是在寻找完美的解决方案,只是寻找跨多行的简单 img 标签。

```html
<img src="fil.png">
```

不应该找到这个,因为它位于 img block 内。

- [ ] Here is another image `<img src="fil.png">` and another <img src="dog.png" title: "re
aaaaaaaaaaaaaaaallllyl long title">

不应找到第一个(因为它被`包围),但它应该找到第二个,即使它跨越多行。

尝试

我尝试了几种不同的方法,使用从 bash 和 grep 到 python 的所有方法。我可以使用以下正则表达式获取 img 标签

<img(\s*(?!alt)([\w\-])+=([\"\'])[^\"\']+\3)*\s*\/?>

但是我觉得更干净的方法可能是这样的

  1. 过滤掉每个代码块
  2. 查找每个 img 标签
  3. 查找每个不带 alt 标签的 img 标签

我在第一步上有点卡住了。我可以使用这个正则表达式找到每个代码块:

```[a-z]*\n[\s\S]*?\n```

但是我不知道如何反转它,例如找到它之外的所有文本。我接受任何可以在 bash 脚本中或从 python 中运行的解决方案。

最佳答案

你说得完全正确,这是正则表达式垃圾桶方法的经典案例:我们*跳过整个匹配中要避免的内容,并使用捕获组来实现我们真正想要的内容,即 What_I_want_to_avoid|(What_I_want_to_match):

```.*?```|`.*?`|(<img(?!.*?alt=(['\"]).*?\2)[^>]*)(>)

这里的想法是完全忽略正则表达式引擎返回的整体匹配:那是垃圾箱。相反,我们只需要检查捕获组 $1,设置后,它包含 img 标签。

Demo

匹配没有 alt 属性的 img 标签的模式是 borrowed here 。描述了垃圾桶方法 herehere .

Sample Code :

import re
regex = r"```.*?```|`.*?`|(<img(?!.*?alt=(['\"]).*?\2)[^>]*)(>)"
test_str = ("```html\n"
"<img src=\"fil.png\">\n"
"```\n\n"
"- [ ] Here is another image <img src=\"fil.png\"> and another `<img src=\"fil.png\">`\n\n"
" ```html\n"
" <a href=\"scratch/index.html\" id=\"scratch\" data-original-title=\"\" title=\"\" aria-describedby=\"popover162945\">\n"
" <div class=\"logo-wrapper\">\n"
" </div>\n"
" <div class=\"name\">\n"
" <span>Scratch</span>\n"
" </div>\n"
" <img src=\"fil.png\">\n"
" </a>\n"
" ```")

matches = re.finditer(regex, test_str, re.DOTALL)
for match in matches:
if match.group(1):
print ("Found at {start}-{end}: {group}".format(start = match.start(1), end = match.end(1), group = match.group(1)))

实际上,只需输入 single backtick pair 就足够了在全场比赛中。然而,它可以说更具可读性,并且更清晰地展示了这个想法,如上所示。

关于python - 查找 Markdown 代码块之外的图像标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51452078/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com