Python正则匹配workorder标签被内部右尖括号提前截断问题求解
问题原因
你当前使用的正则存在两个核心问题:
- 非贪婪匹配
.*?会在遇到第一个>时就终止,不会区分这个>是在属性内部还是标签结束位 - 末尾的
$强制匹配行尾,限制了不同闭合格式的适配性
解决方法
正确正则表达式(Python环境)
\s*(<workorder(?:[^">]|"[^"]*")*?\/?>)\s*
仅需开启单行/DOTALL模式即可,不需要开启多行模式。
正则逻辑说明
\s*:匹配标签前的任意空白字符(空格、换行、制表符均可,兼容标签前有缩进的情况)<workorder:匹配workorder标签的开头(?:[^">]|"[^"]*")*?:非捕获组,循环匹配两类内容,直到遇到标签结束符:[^">]:匹配既不是双引号也不是>的任意字符"[^"]*":匹配一对双引号包裹的所有内容,会跳过属性值内部的所有<、>等符号,不会误判结束位- 非贪婪模式
*?保证找到第一个符合要求的结束符就停止
\/?>:匹配标签结束符,兼容普通闭合>和自闭合/>两种格式
适配性说明
该正则可以覆盖你提到的所有三种数据格式:
- 末尾
>紧邻双引号的场景 - 末尾
>紧邻斜杠的自闭合场景 - 斜杠和
>单独占一行的场景
匹配结果的第一个捕获组就是完整的workorder开始标签内容。
内容的提问来源于stack exchange,提问作者CuriousPenguin
相关产品推荐
相关产品推荐

