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
的子字符串所在位置的每个测试字符串。如果有一个不包含子字符串的测试字符串,它break
s 将退出循环,因为不满足要求。只有当循环没有通过break
终止时,才进入else
循环末尾的else
子句for
,即只有当它正常终止时。只有这样所有测试字符串都满足条件,结果为yield
ed。要从列表更改为字符串,您只需使用source = source[0]
。以上是关于Python - 如何递归搜索作为列表元素的文本中的变量子字符串的主要内容,如果未能解决你的问题,请参考以下文章