Python 仅匹配无歧义十六进制数(非十进制数)的模式
我们都熟悉十六进制数的regexp,但什么是一个聪明的正则表达式,它只匹配无歧义的十六进制数,但不匹配以10/decimal为基数的整数。例子 1f345=匹配 0f123=匹配 12340=不匹配不明确的十进制,可以是十六进制或十进制 01234=不匹配技术上也不是整数 它似乎需要两个正则表达式。首先匹配十六进制数和整数,然后匹配至少一个[a-f][a-f]的结果。但是有更简单的方法吗Python 仅匹配无歧义十六进制数(非十进制数)的模式,python,regex,perl,Python,Regex,Perl,我们都熟悉十六进制数的regexp,但什么是一个聪明的正则表达式,它只匹配无歧义的十六进制数,但不匹配以10/decimal为基数的整数。例子 1f345=匹配 0f123=匹配 12340=不匹配不明确的十进制,可以是十六进制或十进制 01234=不匹配技术上也不是整数 它似乎需要两个正则表达式。首先匹配十六进制数和整数,然后匹配至少一个[a-f][a-f]的结果。但是有更简单的方法吗 这种方法的应用是在保留不明确的数字的同时,将不明确的十六进制数字整体替换为其转换后的十进制版本。正如我上面所
这种方法的应用是在保留不明确的数字的同时,将不明确的十六进制数字整体替换为其转换后的十进制版本。正如我上面所评论的,除非您的输入数据中进一步区分了十进制数和十六进制数,不可能找出哪些数字是十六进制的 虽然十六进制数字允许超出阿拉伯数字0-9的额外数字,但仅由这些数字构成的数字也是有效的十六进制数字,如果是十进制表示,则其值与相同的数字不同 这就是为什么所有允许十进制和十六进制数字出现在其他可能的基(如八进制和二进制)中的编程语言和数据文件都有不同的标记。例如,在C和从C派生的语言中,使用前缀0x,因此任何人都可以发现0x1234和1234之间的差异 如果你真的有这样混合了两个数字基的输入数据,你必须后退一步,找出一种方法来判断哪个数字意味着什么,可能是其他上下文的一部分。如果没有这样的上下文,也没有办法重新生成输入数据,那么您也可以退出您试图实现的任何目标
更新-该文本是在问题文本以另一种形式编写时编写的,不容易理解其真实意图。现在问题更清楚了——我将保留答案,因为这可能是一个很好的建议,对于尝试用魔术的方式区分十六进制和十进制的新手来说,不需要任何额外的标记。要求至少有一个十六进制数字,两边用零个或多个十六进制或十进制数字括起来
[0-9]*[a-f][0-9a-f]*
使用@Adrianhh建议的优化进行了更新。我不认为这可能有用,但您可以使用
/^[0-9]*[a-fA-F][0-9a-fA-F]*\z/
考虑到任何十进制数也是一个有效的十六进制数,我觉得您前面会有一些问题。我委婉地说:这实际上是不可能的-除非您的十六进制数在语法中以一种独特的方式标记为十六进制数,如H后缀或0xprefix@tripleee不清楚OP想要什么。你说他们在问一些明确的情况,但我不确定他们是否意识到12340是有效的十进制和有效的十六进制。这似乎是一个基于误解的XY问题。而且,这似乎是一个非常糟糕的想法。您将从一个具有一些不明确值的文件变成一个每个值都不明确的文件。@Gregory,这没有任何意义。如果这些值不重要,你最好把所有东西都当作十六进制,跳过转换。我看不出你有什么问题。你能展示一些无法判断的案例吗?他已经展示了。以1234为例。它可以是十进制数,然后是十进制1234,也可以是十六进制数,然后是十进制4660,也可以是八进制数,然后是十进制668,或者是所有其他更模糊的基数。十二月是10,十六进制是16。八进制是8。它是二进制的2。@CherryDT你在跟我说话吗?1234是有效的十进制数,因此显然不匹配。就像问题中的12340。是的,现在是了。因为OP在中添加了非模糊部分,以提高性能和减少回溯[0-9]*[a-f][0-9a-f]*可能更好。@Adrianhh非常好;更新!