使用正则表达式匹配Markdown中的图片格式,判断文本是否是图片/链接的开头(不完整):
- 判断文本结尾是否符合Markdown中图片的格式要求
-
Markdown中图片的格式:

-
正则表达式:
.*\!(\[([^[\]]*(\](\([^)]*)?)?)?)?$
def is_incomplete_image_markdown(s):
"""
检查chunk是否是图片的部分
:param s: chunk
:return: True:是图片的局部(不完整) ,False: 非图片 或者 格式完整
"""
partial_pattern = r'.*\!(\[([^[\]]*(\](\([^)]*)?)?)?)?$'
return bool(re.match(partial_pattern, s, re.DOTALL))
# 输出True
print(is_incomplete_image_markdown("大事发生!"))
print(is_incomplete_image_markdown("大事发生!["))
print(is_incomplete_image_markdown("大事发生![lo"))
print(is_incomplete_image_markdown("大事发生![logo]"))
print(is_incomplete_image_markdown("大事发生)
print(is_incomplete_image_markdown("大事发生)
# 输出False
print(is_incomplete_image_markdown("大事发生")) # 格式完整
print(is_incomplete_image_markdown("大事发生其他文本")) # 格式完整
print(is_incomplete_image_markdown("大事发生
-
正则表达式:
.*\[([^[\]]*(\](\([^)]*)?)?)?$
def is_incomplete_url_markdown(s):
"""
检查chunk是否是链接的部分
:param s: chunk
:return: True:是链接的局部(不完整) ,False: 非链接 或者 格式完整
"""
partial_pattern = r'.*\[([^[\]]*(\](\([^)]*)?)?)?$'
return bool(re.match(partial_pattern, s, re.DOTALL))
# 输出True
print(is_incomplete_url_markdown("大事发生["))
print(is_incomplete_url_markdown("大事发生[too"))
print(is_incomplete_url_markdown("大事发生[toolshu]"))
print(is_incomplete_url_markdown("大事发生[toolshu]("))
print(is_incomplete_url_markdown("大事发生[toolshu](https://toolshu.com/"))
# 输出False
print(is_incomplete_url_markdown("大事发生[toolshu](https://toolshu.com/)")) # 格式完整
print(is_incomplete_url_markdown("大事发生[toolshu](https://toolshu.com/)其他文本")) # 格式完整
print(is_incomplete_url_markdown("大事发生[toolshu]](https://toolshu.com/)")) # 格式不规范
print(is_incomplete_url_markdown("大事发生[toolshu(]123")) # 格式不规范
适合使用大模型进行流式输出的场景,可以判断出是否是正在输出图片/链接,并进行相应的处理。
下面的示例代码,进行图片判断时对链接进行兼容(认为链接的格式也是图片,适应模型犯抽的情况),并将链接转换为图片格式,同时兼容 []
、]
、]
等格式错误的情况。
import re
def is_incomplete_image_markdown(s):
"""
检查chunk是否是图片的部分(兼容链接)
:param s: chunk
:return: True:是图片/链接的局部(不完整) ,False: 非图片/链接 或者 格式完整
"""
partial_pattern = r'.*\[([^[\]]*(\](\([^)]*)?)?)?$'
return s.endswith("!") or bool(re.match(partial_pattern, s, re.DOTALL))
def replace_markdown_link_with_image(s):
"""
将markdown链接替换为图片链接
:param s: 输入字符串
:return: 替换后的字符串
"""
pattern = r'[\!]?[\[]?[\!]?\[(.*?)\]\((.*?)\)[\]]?'
result = re.sub(pattern, r'', s)
return result
if __name__ == '__main__':
s = "测试文本 ]其他文本"
print(replace_markdown_link_with_image(s))
# 输出:测试文本 其他文本