如何用Python正则匹配未闭合<lsq>标签内的右单引号’
如何用Python正则匹配未闭合标签内的右单引号’
嘿,我来帮你搞定这个正则问题!你的需求是找出那些处于未闭合的<lsq>标签块里的右单引号’,也就是<lsq>之后要么到行尾都没出现对应的<rsq>,要么遇到下一个<lsq>之前都没闭合的情况。
核心思路拆解
要定位符合要求的’,需要满足两个关键条件:
- 这个
’必须在某个<lsq>之后,并且从该<lsq>到’的这段内容里没有出现过<rsq>(确保还在未闭合的标签块内); - 从
’的位置往后,直到行尾或者下一个<lsq>,也不会出现<rsq>(确保这个标签块最终是未闭合的)。
最终正则表达式
结合这两个条件,我们可以写出这样的正则:
(?<=<lsq>(?:(?!<rsq>).)*)’(?!(?:(?!<lsq>).)*<rsq>)
正则各部分解释
(?<=<lsq>(?:(?!<rsq>).)*):正向后顾断言,用来确认’的前面是一个<lsq>开头,并且中间的所有内容都没有<rsq>((?:(?!<rsq>).)*是“匹配任意字符,只要当前位置不是<rsq>的起始”,确保我们还在未闭合的标签块里);’:我们要匹配的目标字符;(?!(?:(?!<lsq>).)*<rsq>):负向前瞻断言,用来确认从’的位置往后,直到遇到下一个<lsq>或者行尾,都不会出现<rsq>(确保这个标签块不会被闭合)。
Python代码示例
把这个正则用到你的搜索替换场景中,代码如下:
import re # 编译正则(可以复用) pattern = re.compile(r"(?<=<lsq>(?:(?!<rsq>).)*)’(?!(?:(?!<lsq>).)*<rsq>)") # 你的目标文本 text = """<p><lsq>Line one, matched one,<rsq></p> <p><lsq>Line two, unmatched’ one. <lsq>Line two, matched’ pair one.<rsq></p> <p>Line three, ’fore no tag.</p> <p>Line four, ’fore first tag. <lsq>Line four, unmatched one’.</p> <p>Line five free text before. <lsq>Line five, matched one,<rsq> <lsq>line five, ’matched two.<rsq> Line five’ free text after.</p> <p><lsq>Line six matched one<rsq>, line six free text! <lsq>Line six matched two hittin’ and sittin’ and goin’ on forever.<rsq></p> <p><lsq>Line seven unmatched’ one.</p> <p>Line eight free text. Line <lsq>eight’ unmatched one, <lsq>unmatched’ two.</p>""" # 执行替换,把符合条件的’换成<tag> processed_text = pattern.sub(r"<tag>", text) print(processed_text)
效果验证
运行这段代码后,只有你指定的那些’会被替换:
- Line two里的
unmatched’ one中的’ - Line four里的
unmatched one’中的’ - Line seven里的
unmatched’ one中的’ - Line eight里的
eight’和unmatched’ two中的’
而闭合标签块里的、自由文本里的’都会被忽略,完全符合你的需求。
备注:内容来源于stack exchange,提问作者vr8ce
相关产品推荐
相关产品推荐

