从字符串中提取字符串的最有效方法是什么?
What is the most efficient way at extracting a string out of a string?
我有一个 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 字符串被解码为 THIS.
56024939146241&56024939146241&0&X168&1422555109&JYIGINVM&ayy&FFFFFF&&1&3&1&uwoodles7776@jourrapide.com&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>');
这是一种 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
。但是,根据您输入的变化程度,您可能需要添加更多智能。
我有一个 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 字符串被解码为 THIS.
56024939146241&56024939146241&0&X168&1422555109&JYIGINVM&ayy&FFFFFF&&1&3&1&uwoodles7776@jourrapide.com&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>');
这是一种 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
。但是,根据您输入的变化程度,您可能需要添加更多智能。