【求助】正则如何查找未匹配的闭合标签

其实,你大可直接把中文英文标签删除,
然后重新匹配汉字,加上新标签。

谢谢!本来想弄懂这个问题,在网上耗费了很多时间。在网上看到的也是两种处理方式,一、绕道,二、举例。举例的本人都试了,要么报错要么不是需要的结果。主要还是本人水平很低,所以现在只想直接获取答案。没有更多时间去捣鼓了。

要闭合标签找我啊。

1 Like

兄台的工具确实强大哈,推荐。

不过对有的嵌套位置问题判定过于严格,如<a><b><c><d></b></d></c></a>
会报4条错误。

手工改正,只要把</b>后挪一下就可消除这4条错误。

1 Like

请问在哪儿?

写得很简陋,还有很多问题,有需要可以把文本文件发我。标签错误的行号列号,会给你标注出来。

1 Like

@jcz777 请教下,为什么你要用正则引擎Onigmo的格式 [\x{4e00}-\x{9fff}],缺省引擎的格式 [\u4e00-\u9fff] 不是更好吗?有什么说法?

1 Like

为了能匹配扩展区汉字。

默认的boost regex引擎做不到,只能换Onigmo了。

Emeditor汉字匹配
注意:重要一个,正则表达式引擎修改为:Onigmo。


基本汉字	[\x{3007}\x{4e00}-\x{9fff}]
扩展A区	[\x{3400}-\x{4DBF}]
扩展B区	[\x{20000}-\x{2A6DF}]
扩展C区	[\x{2A700}-\x{2B73F}]
扩展D区	[\x{2B740}-\x{2B81F}]
扩展E区	[\x{2B820}-\x{2CEA1}]
扩展F区	[\x{2CEB0}-\x{2EBE0}]
扩展G区	[\x{30000}-\x{3134A}]
兼容	[\x{F900}-\x{FAD9}]
兼容扩展	[\x{2F800}-\x{2FA1D}]
部首扩展	[\x{2E80}-\x{2EF3}]
注音	[\x{3105}-\x{312F}]
笔画	[\x{31C0}-\x{31E3}]
康熙部首	[\x{2F00}-\x{2FD5}]
注音扩展	[\x{31A0}-\x{31BA}]
私用SSP	[\x{E000}-\x{F8FF}]
私用PUA-A	[\x{F0000}-\x{FFFFF}]
私用PUA-B	[\x{100000}-\x{10FFFF}]
3 Likes

就是说,如果选默认的boost regex引擎,用这个式子 [\u4e00-\u9fff] 也搜不到扩展区汉字?这就不太好理解了,不是 4e00~9fff 区间对了就能匹配到吗?

我的理解,不同引擎的差别只是写法不同,\x{4e00} \u4e00,难道还有别的不同?

2 Likes

基本区汉字4e00-9fff有20992个汉字,一般来说,用这个范围就可以了。
但是经常会碰到扩展区的汉字,boost regex就匹配不了。
(最常用的新华字典都有一百多个B区汉字)

1 Like

谢谢解答!还是不太理解这两个引擎为什么会有这个差别。

EmEditor用扩展A区第一个字“㐀”试验发现:

  • 缺省引擎 \u3400 搜不到
  • 缺省引擎 \x{3400} 可以搜到
  • Onigmo引擎 \u3400 可以搜到
  • Onigmo引擎 \x{3400} 可以搜到

根据这个网页的介绍,Onigmo引擎下匹配所有汉字可以用 \p{Han},刚试了下 “㐀” 这个字是可以匹配到的
<>EmEditor v15.7.0 beta 1 – EmEditor (Text Editor)<>

使用\p{Han},需要考虑词典文本字符覆盖的范围。Unicode已经更新到15, 而Onigmo目前只支持到Unicode 12,也就是说对于13-15的汉字,用\p{Han},是匹配不到的。

4 Likes

谢谢!<><><>

多谢!暂时还不需要,期盼大作早日完善。

2 Likes

Onigmo,H区也是可以匹配到的。

[\x{31350}-\x{323af}]

截图未命名

1 Like

我们说的不是一回事啊,你用\p{Han}能匹配H区的汉字?

0.0.
呵,没看仔细。确实。
phan

2 Likes

非常感谢各位的鼎力相助,热情回复,受益匪浅。

确实如 atauzki 所说,bs4会自动修复非闭合的标签

#测试1
>>> from bs4 import BeautifulSoup
>>> t = '<span class="ex"> <span class="ch">👉灯一下又亮了。<en> </span> <span class="en">After a while the lights went on again.<en> </span> <ex> </span>'
>>> BeautifulSoup(t).find(class_='ex')
<span class="ex"> <span class="ch">👉灯一下又亮了。<en> </en></span> <span class="en">After a while the lights went on again.<en> </en></span> <ex> </ex></span>
#测试2
>>> t = '<span class="ex"> <span class="ch">👉灯一下又亮了。<span class="en">After a while the lights went on again.'
>>> BeautifulSoup(t).find(class_='ex')
<span class="ex"> <span class="ch">👉灯一下又亮了。<span class="en">After a while the lights went on again.</span></span></span>

bs4的修复逻辑不一定符合你的要求

#测试3
>>> t = '<span class="ex"> <span class="ch">👉灯一下又亮了。<en> <span class="en">After a while the lights went on again.<en> </span> <ex> </span>'
>>> BeautifulSoup(t).find(class_='ex')
<span class="ex"> <span class="ch">👉灯一下又亮了。<en> <span class="en">After a while the lights went on again.<en> </en></span> <ex> </ex></en></span></span>

最好先找找有没有更靠谱的数据源,以免白做工


我以前用emeditor的时候,会用这种方法从里到外一层一层剥掉标签,
em

添加到批处理里面,一般执行十几次就可以,最后剩下的都是有问题的。(做这一步之前要先处理一下自闭合的标签)

3 Likes

再次感谢楼上各位,查找的方法应该了解了。同时再次感谢 @Vim @last_idol @jcz777 指点解决带出来的标签问题。

1 Like