首页 > 解决方案 > 如果括号中存在其他字符串,则正则表达式捕获字符串

问题描述

我正在尝试创建一个 Python 正则表达式来捕获文件名,但前提是文本“external=true”出现在所谓的文件名之后的方括号内。

我相信我快到了,但缺少一个特定的用例。本质上,我想捕获qrcode:和 first之间的文本[,但前提是文本external=true出现在两个方括号之间。

我创建了正则表达式qrcode:([^:].*?)\[.*?external=true.*?\],它不适用于下面的第二行:它错误地返回 vcard3.txt 并且不返回 vcard4.txt。

qrcode:vcard1.txt[external=true] qrcode:vcard2.txt[xdim=2,ydim=2]
qrcode:vcard3.txt[xdim=2,ydim=2] qrcode:vcard4.txt[xdim=2,ydim=2,external=true]
qrcode:vcard5.txt[xdim=2,ydim=2,external=true,foreground=red,background=white]
qrcode:https://www.github.com[foreground=blue]

https://regex101.com/r/bh3IMb/3

标签: pythonregex

解决方案


使用正向前瞻 (for qrcode:) 和正向后视 (for[*external=true与惰性匹配来捕获最小的此类组。

Regex101解释:https ://regex101.com/r/bOezIm/1

一个完整的python示例:

import re

pattern = r"(?<=qrcode:)[^:]*?(?=\[[^\]]*?external=true)"
string = """
qrcode:vcard1.txt[external=true] qrcode:vcard2.txt[xdim=2,ydim=2]
qrcode:vcard3.txt[xdim=2,ydim=2] qrcode:vcard4.txt[xdim=2,ydim=2,external=true]
qrcode:vcard5.txt[xdim=2,ydim=2,external=true,foreground=red,background=white]
qrcode:https://www.github.com[foreground=blue]
"""
print(re.findall(pattern, string))

推荐阅读