Python - 如何递归搜索作为列表元素的文本中的变量子字符串

Posted

技术标签:

【中文标题】Python - 如何递归搜索作为列表元素的文本中的变量子字符串【英文标题】:Python - how to recursively search a variable substring in texts that are elements of a list 【发布时间】:2020-03-14 00:21:04 【问题描述】:

让我更好地解释一下我在标题中的意思。 要搜索的字符串示例(即可变长度的字符串 每一个都是列表的一个元素;实际上非常大):

STRINGS = ['sftrkpilotndkpilotllptptpyrh', 'ffftapilotdfmmmbtyrtdll', 'gftttepncvjspwqbbqbthpilotou', 'htfrpilotrtubbbfelnxcdcz']

要查找的子字符串,我知道是肯定的:

包含在STRINGS的每个元素中 也包含在SOURCE字符串中 是某个固定的LENGTH(本例中为5个字符)。
SOURCE = ['gfrtewwxadasvpbepilotzxxndffc']

我正在尝试编写一个 Python3 程序,该程序在 SOURCE 中找到这个隐藏的 5 个字符的 单词 以及它在 STRINGS 的每个元素中出现的位置。

我也在尝试将结果存储在数组或字典中(我不知道目前什么更方便)。

此外,我需要执行相同类型但具有不同LENGTH 值的其他搜索,因此该值应由变量提供,以便更通用。

我知道 first 点已经在之前的帖子中解决了,但是 从不(据我所知)与 second 点一起,这是我无法成功处理的代码部分(我没有发布我的代码,因为我知道它离可修复太远了)。

非常感谢这个伟大社区的任何帮助。

-- 毛里齐奥

【问题讨论】:

【参考方案1】:

您可以遍历源字符串并为每个子字符串使用re 模块来查找每个其他字符串中的位置。然后,如果每个字符串至少出现一次,则产生结果:

import re

def find(source, strings, length):
    for i in range(len(source) - length):
        sub = source[i:i+length]
        positions = 
        for s in strings:
            # positions[s] = [m.start() for m in re.finditer(re.escape(sub), s)]
            positions[s] = [i for i in range(len(s)) if s.startswith(sub, i)]  # Using built-in functions.
            if not positions[s]:
                break
        else:
            yield sub, positions

生成器可以如下例所示使用:

import pprint

pprint.pprint(dict(find(
    source='gfrtewwxadasvpbepilotzxxndffc',
    strings=['sftrkpilotndkpilotllptptpyrh',
             'ffftapilotdfmmmbtyrtdll',
             'gftttepncvjspwqbbqbthpilotou',
             'htfrpilotrtubbbfelnxcdcz'],
    length=5
)))

产生以下输出:

'pilot': 'ffftapilotdfmmmbtyrtdll': [5],
           'gftttepncvjspwqbbqbthpilotou': [21],
           'htfrpilotrtubbbfelnxcdcz': [4],
           'sftrkpilotndkpilotllptptpyrh': [5, 13]

【讨论】:

不是说它被问题所涵盖,答案是惊人的,但这不会涵盖正确的? (例如:lotabcdpi -> pilot 环绕)。这会使事情复杂化:P 对不起,我忘了说代码应该只由内置命令组成,即..不允许导入额外的 mofules。 @Error-SyntacticalRemorse 在这种情况下,您可以在匹配子字符串之前使用s += s[:length-1](或者更确切地说匹配s + s[:length-1])。 @a_guest 我接受了你的解决方案。还有两点:您能否解释一下您的代码行,特别是定义函数 find 时的内部 for 循环对我来说不是很清楚。此外,您将源变量定义为字符串,而我写道它应该是作为列表的单个元素的字符串。虽然从列表到字符串的转换很容易,但我想知道代码会如何改变。无论如何,感谢您的支持。 @MaurizioCirilli 内部for 循环检查包含长度为length 的子字符串所在位置的每个测试字符串。如果有一个不包含子字符串的测试字符串,它breaks 将退出循环,因为不满足要求。只有当循环没有通过break 终止时,才进入else 循环末尾的else 子句for,即只有当它正常终止时。只有这样所有测试字符串都满足条件,结果为yielded。要从列表更改为字符串,您只需使用source = source[0]

以上是关于Python - 如何递归搜索作为列表元素的文本中的变量子字符串的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 搜索链接列表中的元素(迭代和递归)

在 qml 如何保存作为列表视图元素的标签文本

python之内置函数与匿名函数递归函数初识

查找列表中的最小元素(递归) - Python

Python。重复元素判定。编写一个函数,接受列表作为参数

如何深度搜索 Python 列表?