从字符串中提取字符串的最有效方法是什么?

时间:2015-01-29 18:31:53

标签: python python-3.x

我有一个python函数,可以输出像THIS这样的字符串。

    if (X1079) { clearTimeout (X1079); X1079 = null; }
X781 ('<FORM name="X58" method="POST" action="http://us21.chatzy.com/56024939146241"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="NTYwMjQ5MzkxNDYyNDEmNTYwMjQ5MzkxNDYyNDEmMCZYMTY4JjE0MjI1NTUxMDkmSllJR0lOVk0mYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>');

现在,最后,是一个用Base64编码的字符串

NTYwMjQ5MzkxNDYyNDEmNTYwMjQ5MzkxNDYyNDEmMCZYMTY4JjE0MjI1NTUxMDkmSllJR0lOVk0mYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm

但我无法想象每次都提取这个字符串的任何实际方法,因为第一个(更长的)字符串每次都会改变 并且可能有不同的内容和长度,无论如何,那么Base64字符串被解码成这个。

56024939146241&56024939146241&0&X168&1422555109&JYIGINVM&ayy&FFFFFF&&1&3&1&uwoodles7776@jourrapide.com&7zsp0&1422803843&&0&

现在,我们也看到了这部分解码后的字符串

JYIGINVM

这就是我需要得到的东西,应该注意的是,上面所有字符串的内容每次都会改变,即使长度也是如此,所有的改变都会改变,但是有一些东西,比如&符号和值&#39; s第一个字符串中的名称。还应该注意的是,我们想要的第三个字符串中的八个字母总是在第五个&符号之后。

我已经尝试了太多次这样做,我的代码基于互联网上的研究,但我未能达到任何一致的结果,因此,我来​​到这里询问最有利的方式来进行如果可能的话,任务也是一些例子。先感谢您。 :)

第一个字符串的其他例子。

if (X1079) { clearTimeout (X1079); X1079 = null; }
X781 ('<FORM name="X58" method="POST" action="http://us23.chatzy.com/31039888252154"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="MzEwMzk4ODgyNTIxNTQmMzEwMzk4ODgyNTIxNTQmMCZYMTY4JjE0MjI1NTY0MjcmVUZWS0VPUUEmYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>');

1 个答案:

答案 0 :(得分:3)

这是一种re方式:

import re
import base64

data = """
if (X1079) { clearTimeout (X1079); X1079 = null; }
X781 ('<FORM name="X58" method="POST" action="http://us23.chatzy.com/31039888252154"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="MzEwMzk4ODgyNTIxNTQmMzEwMzk4ODgyNTIxNTQmMCZYMTY4JjE0MjI1NTY0MjcmVUZWS0VPUUEmYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>');"""

# Find length of characters starting with value=" and over 50 chars long
base64str = re.search("value=\"(\w{50,})\"", data).group(1)

# Decode
s = base64.decodebytes(base64str.encode()).decode(errors="ignore")

# Find section after 5th &
out = re.search("(.+?&){5}(.+?)&", s).group(2)

print(out)

替代的第一个re.search是:

# Find the pattern name="X691" value="<base64 stuff>"
base64str = re.search("name=\"X691\" value=\"(\w+)\"", data).group(1)

这可能会更好,取决于您的输入长度变化多少。

为您的第一个示例输出JYIGINVM,为第二个示例输出UFVKEOQA。但是,根据您的输入变化的程度,您可能需要添加更多智能。