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

标签 python python-3.x

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

    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 字符串被解码为 THIS。

56024939146241&56024939146241&0&X168&1422555109&JYIGINVM&ayy&FFFFFF&&1&3&1&<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c6b3b1a9a9a2aaa3b5f1f1f1f086aca9b3b4b4a7b6afa2a3e8a5a9ab" rel="noreferrer noopener nofollow">[email protected]</a>&7zsp0&1422803843&&0&

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

JYIGINVM

这就是我需要得到的,应该注意的是,上面所有字符串的内容每次都会发生变化,即使长度也一样,除了第一个字符串中的&符号和值名称之类的一些东西之外,所有内容都发生了变化。还应该注意的是,我们想要从第三个字符串中得到的八个字母始终位于第五个与号之后。

我已经尝试了很多次这样做,我的代码基于互联网上的研究,但我一直无法达到任何一致的结果,所以,我来这里询问什么是最有利的方式来进行如果可能的话,还需要一些例子。先感谢您。 :)

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

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>');

最佳答案

这是一种重新方法:

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 。但是,根据您输入的变化程度,您可能需要添加更多智能。

关于python - 从字符串中提取字符串的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28221985/

相关文章:

python - Pandas 与重复的键合并 - 删除重复的行或阻止它的创建

python-2.7 - 获取错误行号 Python

python-3.x - 如何在 python 上使用 PAHO-MQTT 订阅多个主题

python - 如何使用 Paramiko 获取 SSH 返回码?

python - PIP无法安装auto-py-to-exe

python - 你如何在 Python 中的 Selenium Webdriver 上设置脚本超时?

python - 类型错误 : object of type 'int' has no len() - Python/Pygame

python - 如何正确引发 FileNotFoundError?

python - Python 中 RuntimeException 和 Exception 的区别

python - 0-23 小时军用时钟到标准时间 (hh :mm)