是否可以通过十六进制使用正则表达式来查找电子邮件地址

时间:2012-11-02 22:37:51

标签: python regex computer-forensics

不确定这是否可行但我一直在寻找使用Regex来获取Hex的电子邮件地址。基本上这是建立我的一些自动取证工具,但我在制作合适的Regex算法时遇到了问题。

电子邮件的正则表达式:/^([a-z0-9_.-]+)@([\da-z.-]+).([az.]{2,6})$/

十六进制值:

@ = 40
. = 2E
.com = 636f6d
_ = 5f
A/a = 41/61 [1]
Z/z = 5a/7a
- = 2d

这就是我现在所拥有的(它只考虑小写和.com)。但它不起作用!我搞砸了一些简单的东西吗?

"/^([61-7a]+)40([61-7a]+)23(636f6d)$/"

[1]我知道电子邮件只能是小写,但我也需要考虑大写。

5 个答案:

答案 0 :(得分:1)

我认为你正在接近这个问题。假设您使用的是标准的十六进制字符等效项,则应首先将电子邮件转换为十六进制,然后使用电子邮件正则表达式。这可以通过简单地一次处理两个字符的电子邮件,并在每个字符上使用chr(int('piece, 16))来完成。

答案 1 :(得分:1)

定义类

@ = 40
. = 2E
com = 636f6d
_ = 5f
a-z = (4[1-9a-f]|5[0-9a])
A-Z = (6[1-9a-f]|7[0-9a])
- = 2d

替换你的正则表达式

/^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$/

/^(((4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])|[0-9]|5f|2E|2d)+)40(([0-9]|(4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])|2E|2d)+)2E(((4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])){2,6})$/

分解为......

/^
(
    (
        (4[1-9a-f]|5[0-9a])     // a-z
        |(6[1-9a-f]|7[0-9a])    // A-Z
        |[0-9]                  // 0-9
        |5f                     // _
        |2E                     // .
        |2d                     // -
    )+ // 1 or more times
) 
40
(
    (
        [0-9]                   // 0-9
        |(4[1-9a-f]|5[0-9a])    // a-z
        |(6[1-9a-f]|7[0-9a])    // A-Z
        |2E                     // .
        |2d                     // -
    )+ // 1 or more times
)
2E                              // .
(
    (
        (4[1-9a-f]|5[0-9a])     // a-z
        |(6[1-9a-f]|7[0-9a])    // A-Z
    ){2,6} // between 2 and 6 times
)$/

答案 2 :(得分:0)

我认为您需要查看Python中正则表达式的文档(http://docs.python.org/2/library/re.html)。

例如,[61-7a]将匹配6,1-7或a中的任何一个。

答案 3 :(得分:0)

稍微远离您想要实现的目标,但请查看Bulk Extractor,它会解析驱动器并删除电子邮件地址并按流行顺序列出它们。

答案 4 :(得分:0)

我无法在任何地方发表评论,因为我已经回答了这些问题,但我认为这需要说明。

您正在采取的方法实际上比将每个字符转换为ASCII等效字符更糟糕。您实际上是将每个字节转换为 2个ASCII字符

仅引用您作为最终/工作模式发布的REGEX模式的一部分:4[0-9a-fA-F] 您正在尝试查找字符@ABCDEFGHIJKLMNO。您有a-f A-F,因为您正在尝试考虑以大写或小写形式存储的十六进制代码。硬盘驱动器上的十六进制代码不会以大写或小写形式存储(它甚至不会以十六进制代码存储)。您正在考虑向您提供此数据的任何工具 - 以ASCII格式。

您使用什么工具来访问此数据?

如果您使用python读取dd图像文件,则需要使用原始数据之后的正则表达式。这就像复制上面那样[\x40-\x4f]。这都是不必要的,因为[@-O]会完成同样的事情。

我不确定您是如何对此进行测试的,但我怀疑您将十六进制代码粘贴到在线REGEX测试引擎中。然后,测试引擎将这些十六进制代码解释为两个单独的字符,而不是一个字节中的一对半字节。