Python regex查找xml1.0不支持的字符时不返回任何结果

2024-06-24 13:07:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python3.2脚本,在Unicode-XML格式的文本文件中查找在xml1.0中无效的字符。文件本身不是XML1.0,所以它可以很容易地包含1.1和更高版本支持的字符,但是使用它的应用程序只能处理XML1.0中有效的字符,所以我需要找到它们。在

XML 1.0不支持\u0001-\u0020范围内的任何字符,但\u0009、\u000A、\u000D和\u0020除外。除此之外,\u0021-\uD7FF和\u010000-\u10FFFF也是受支持的范围,但不支持其他范围。在Python代码中,我用以下方式定义regex模式:

re.compile("[^\u0009\u000A\u000D\u0020\u0021-\uD7FF\uE000-\uFFFD\u010000-\u10FFFF]")

但是,下面的代码在我的示例文件中找不到已知的错误字符(\u0007,bell字符)。很遗憾,我无法提供示例行(专有数据)。在

我认为问题出在两个地方之一:要么是一个坏的regex模式,要么是我如何打开文件并以行读取,即编码问题。当然,我可能错了。在

下面是相关的代码片段。在

processChunkFile()有三个参数:chunkfile是指向文件的绝对路径(在本例中是原始文件的500000行组成的“块”),该文件可能包含也可能不包含错误字符。outputfile是指向可选的、预先存在的要写入输出的文件的绝对路径。verbose是一个布尔标志,用于启用更详细的命令行输出。其余的代码只是获取命令行参数(使用argparse)并将单个大文件分解成更小的文件。(原始文件通常大于4GB,因此需要“分块”它。)

^{pr2}$

Tags: 文件代码示例模式xml字符regexu0021
2条回答

删除两个已知标记或字符串中两个已知字符之间的单词、字符、字符串或任何内容的最快方法是使用RE和Common的直接和本机C方法,如下所示。在

var = re.sub('<script>', '<! ', var)
var = re.sub('</script>', ' >', var)
#And finally
var = re.sub('<! .*? >', '', var)

它能去除一切,比靓汤更快、更好、更干净。批处理文件是“”开始出现的地方,只是从native C中借来用于批处理和html。当将所有Python方法与正则表达式一起使用时,您必须认识到Python并没有与机器语言使用的所有正则表达式有太大的改变,所以为什么要多次迭代,因为一个循环可以在一次迭代中找到所有这些方法的一个块?也可以对角色单独执行相同的操作。在

^{pr2}$

你不需要漂亮的汤。如果您了解这是如何工作的,您也可以使用它们来清理数据。在

\u010000

Python\u转义符只有四位数字,因此U+0100后跟两个U+0030位零。对BMP之外的字符使用大写U转义符和八位数字:

^{pr2}$

请注意,在Python的“窄构建”中,这个和您的表达式一般不起作用,在Python中,字符串基于UTF-16代码单元,BMP之外的字符作为两个代理代码单元处理。(窄版本是Windows的默认版本。谢天谢地,他们放弃了python3.3。)

it could easily contain characters supported in 1.1 and later

(尽管XML1.1只能在这些字符被编码为数字字符引用&#...;时包含这些字符,因此文件本身可能仍然不是格式良好的。)

open(chunkfile, 'r')

您确定chunkfile是用locale.getpreferredencoding编码的吗?在

The original file's typically larger than 4GB, hence the need to 'chunk' it.

呃,怪物XML很痛苦。但是使用合理的流式API(和文件系统!)应该还是可以处理的。例如,您可以使用for line in chunk:一次处理每一行,而不是使用readlines()同时读取所有块。在

re.search(invalidCharacters, line)

由于invalidCharacters已经是一个编译的模式对象,所以您可以invalidCharacters.search(...)。在

说了这么多,对我来说它仍然符合U+0007的铃声。在

相关问题 更多 >