我使用LanguageTool(LT)并启用了--xmlfilter选项来拼写检查HTML文件。这将强制LanguageTool在运行拼写检查之前删除所有标记。在
这也意味着所有报告的字符位置都是关闭的,因为它看不到标签。在
例如,如果我检查以下HTML片段:
<p>This is kin<b>d</b> o<i>f</i> a <b>stupid</b> question.</p>
LanguageTool将其视为纯文本句子:
^{pr2}$并返回以下消息:
^{3}$(在本例中,它标记了“kind of a.”)
由于搜索字符串可能被包装在标记中,并且可能多次出现,所以我无法进行简单的索引搜索。在
在HTML文件中可靠地定位给定文本字符串的最有效的Python解决方案是什么?(它返回一个大致的字符位置,根据标记的数量以及标记单词前后的单词,该位置可能会关闭10-30%。)
也就是说,我需要做一个搜索,忽略所有的标签,但包括他们的字符位置计数。在
在这个特定的例子中,我必须找到“a类”并找到字母k的位置:
kin<b>d</b> o<i>f</i>a
{cd1>因为这个选项而被弃用。正确的解决方案是自己删除标记,但保留位置,这样您就有一个映射来更正从LT返回的结果。当从Java使用LT时,AnnotatedText支持这一点,但是算法应该足够简单,可以移植它。(全面披露:我是LT的维护者)
这可能不是最快的方法,但是pyparsing可以识别大多数形式的HTML标记。下面的代码反转典型的扫描,创建一个匹配任何单个字符的扫描仪,然后配置扫描仪跳过HTML打开和关闭标记,以及常见的HTML
'&xxx;'
实体。pyparsing的scanString
方法返回一个生成器,该生成器生成匹配的标记、每个匹配的开始和结束位置,因此很容易构建一个列表,将标记之外的每个字符映射到其原始位置。从这里开始,剩下的几乎就是''.join
并索引到列表中。请参见下面代码中的注释:相关问题 更多 >
编程相关推荐