首页 > 解决方案 > 如何在 Python 中为具有随机长度和字符顺序的字符串创建搜索词?

问题描述

我想使用 Python 中的twint 工具来搜索包含埃塞俄比亚这个词的所有可能拼写的推文,包括夸大其词,例如 ETHIOOOPIAAAA 和ethioopiaaaa。到目前为止,我已经尝试创建一个搜索词,它是一个字符串,f"e{eth}a"其中eth随机长度的字符串介于 0-18 个字符之间,以 e 开头,以 a 结尾,中间有随机的字符顺序,其中的字符是有限的到 e,t,h,i,o,p,a。

我试过用这个:

import random

eth_chars = "ethiopa"
eth = ""

for i in range(0,18):
    eth += random.choice(eth_chars)

search_term = f"e{eth}a"

这不起作用,因为它将一个生成的字符串分配给search_term并搜索该单个术语,但我想搜索任何长度为 0-18 字符的所有可能字符串。遵循此规则:

e - (e,t,h,i,o,p,a 的随机顺序) - a

另外,我需要使查询不区分大小写。我试图.casefold()在配置像这样的'config.Search = search_term.casefold()'这样的twint时将字符串方法添加到搜索查询中,假设这只会读取字符串并忽略大小写。我不确定这会奏效。

任何帮助将不胜感激。

标签: pythonweb-scrapingdata-analysistwint

解决方案


您可以使用itertools.product计算值列表的笛卡尔积,例如获取所有可能的组合。

如果你想保持字母顺序,你需要生成一个这样的组合数组:

[['e', 'E', 'ee', 'eE', 'Ee', 'EE'], ['t', 'T', 'tt', 'tT', 'Tt', 'TT'], ['h', 'H', 'hh', 'hH', 'Hh', 'HH'], ['i', 'I', 'ii', 'iI', 'Ii', 'II'], ['o', 'O', 'oo', 'oO', 'Oo', 'OO'], ['p', 'P', 'pp', 'pP', 'Pp', 'PP'], ['i', 'I', 'ii', 'iI', 'Ii', 'II'], ['a', 'A', 'aa', 'aA', 'Aa', 'AA']]

然后使用以下方法处理所有可能的组合itertools.product

import itertools

eth_chars = list("ethiopia")
max_length = 2

combinations = []
for idx,character in enumerate(eth_chars):
    char_arr= [] # ['ee','e','E','EE','eE','Ee']

    char_arr.append(eth_chars[idx]) #add 'e'
    char_arr.append(eth_chars[idx].upper()) #add 'E'
    for item in itertools.product(eth_chars[idx] + eth_chars[idx].upper(), repeat=max_length):
        char_arr.append("".join(list(item))) #add any combination 'eE', 'EE', 'Ee'

    combinations.append(char_arr) # [['ee','e','E','EE','eE','Ee']]

print(combinations)
for element in itertools.product(*combinations):
    print("".join(element))

在 repl.it 上试试这个

注意 :

  • 上面的方法假设您希望字母顺序正确,而不是处理排列
  • 仅当 max_length=2 时,它返回 1 679 616 个组合,如果删除大写组合(eEEe),您将有 65 536 个组合,如下所示:
import itertools

eth_chars = list("ethiopia")
max_length = 2

combinations = []
for idx,character in enumerate(eth_chars):
    char_arr= [] # ['ee','e','E','EE','eE']
    for count in range(0,max_length):
        char_arr.append(eth_chars[idx]*(count+1))
        char_arr.append(eth_chars[idx].upper()*(count+1))
    combinations.append(char_arr) # [['ee','e','E','EE']]

for element in itertools.product(*combinations):
    print("".join(element))

推荐阅读