Python字符串模式识别/压缩

2023-11-24

我可以做基本的正则表达式,但这略有不同,即我不知道模式会是什么。

例如,我有一个类似字符串的列表:

lst = ['asometxt0moretxt', 'bsometxt1moretxt', 'aasometxt10moretxt', 'zzsometxt999moretxt']

在这种情况下,公共模式是公共文本的两段:'sometxt' and 'moretxt',由长度可变的其他内容开始和分隔。

公共字符串和变量字符串当然可以以任意顺序和任意次数出现。

将字符串列表压缩/压缩为其公共部分和单独变体的好方法是什么?

示例输出可能是:

c = ['sometxt', 'moretxt']

v = [('a','0'), ('b','1'), ('aa','10'), ('zz','999')]

该解决方案找到两个最长的公共子字符串并使用它们来分隔输入字符串:

def an_answer_to_stackoverflow_question_1914394(lst):
    """
    >>> lst = ['asometxt0moretxt', 'bsometxt1moretxt', 'aasometxt10moretxt', 'zzsometxt999moretxt']
    >>> an_answer_to_stackoverflow_question_1914394(lst)
    (['sometxt', 'moretxt'], [('a', '0'), ('b', '1'), ('aa', '10'), ('zz', '999')])
    """
    delimiters = find_delimiters(lst)
    return delimiters, list(split_strings(lst, delimiters))

find_delimiters和朋友找到分隔符:

import itertools

def find_delimiters(lst):
    """
    >>> lst = ['asometxt0moretxt', 'bsometxt1moretxt', 'aasometxt10moretxt', 'zzsometxt999moretxt']
    >>> find_delimiters(lst)
    ['sometxt', 'moretxt']
    """
    candidates = list(itertools.islice(find_longest_common_substrings(lst), 3))
    if len(candidates) == 3 and len(candidates[1]) == len(candidates[2]):
        raise ValueError("Unable to find useful delimiters")
    if candidates[1] in candidates[0]:
        raise ValueError("Unable to find useful delimiters")
    return candidates[0:2]

def find_longest_common_substrings(lst):
    """
    >>> lst = ['asometxt0moretxt', 'bsometxt1moretxt', 'aasometxt10moretxt', 'zzsometxt999moretxt']
    >>> list(itertools.islice(find_longest_common_substrings(lst), 3))
    ['sometxt', 'moretxt', 'sometx']
    """
    for i in xrange(min_length(lst), 0, -1):
        for substring in common_substrings(lst, i):
            yield substring


def min_length(lst):
    return min(len(item) for item in lst)

def common_substrings(lst, length):
    """
    >>> list(common_substrings(["hello", "world"], 2))
    []
    >>> list(common_substrings(["aabbcc", "dbbrra"], 2))
    ['bb']
    """
    assert length <= min_length(lst)
    returned = set()
    for i, item in enumerate(lst):
        for substring in all_substrings(item, length):
            in_all_others = True
            for j, other_item in enumerate(lst):
                if j == i:
                    continue
                if substring not in other_item:
                    in_all_others = False
            if in_all_others:
                if substring not in returned:
                    returned.add(substring)
                    yield substring

def all_substrings(item, length):
    """
    >>> list(all_substrings("hello", 2))
    ['he', 'el', 'll', 'lo']
    """
    for i in range(len(item) - length + 1):
        yield item[i:i+length]

split_strings使用分隔符分割字符串:

import re

def split_strings(lst, delimiters):
    """
    >>> lst = ['asometxt0moretxt', 'bsometxt1moretxt', 'aasometxt10moretxt', 'zzsometxt999moretxt']
    >>> list(split_strings(lst, find_delimiters(lst)))
    [('a', '0'), ('b', '1'), ('aa', '10'), ('zz', '999')]
    """
    for item in lst:
        parts = re.split("|".join(delimiters), item)
        yield tuple(part for part in parts if part != '')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python字符串模式识别/压缩 的相关文章

随机推荐

  • Outlook 2007 / 2013 不渲染 CSS 字体系列声明

    我正在使用 Litmus 测试电子邮件设计 但我无法在 Outlook 2007 2010 2013 中正确设置字体 每一个 HTML CSS 技巧 hack 都继续在 Times New Roman 中呈现 我主要使用简单的表格进行布局
  • JavaScript 属性继承

    我正在尝试创建一个通用的 List 类 其中包含 属性 项目 这将是一个 无论什么 的数组 方法 Add 这将是抽象的并由特定的 List 对象实现 方法 Count 返回 项目 的数量 然后创建继承自 List 的子类 Class Lis
  • 支持多种屏幕尺寸 - Android

    我将在 Android 中开发新的应用程序 此应用程序只能在纵向模式下运行 即使对于平板电脑也是如此 此外 手机和平板电脑上的用户界面和布局设计应该相似 我们无法改变平板电脑的布局设计 因为它有很大的使用面积 我们必须拉伸所有图像以匹配手机
  • 权限处理的模式/设计建议

    我们的 ASP NET Web 应用程序中有一个相当复杂的权限处理系统 用户可以对不同类型的对象拥有特定的权限 某些权限甚至打包到分配给用户的组 角色中 总而言之 这最终会导致相当复杂的混乱 为了确定用户是否可以执行 查看某些内容 您必须评
  • 真随机数生成器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 抱歉 这不是一个 真正的 问题 但我记得以前在这里看到过一篇关于随机随机化随机发生器以生成真正随机数的帖子 而不仅仅是伪随机数 如果我搜索它 我看不
  • 以编程方式确定 Excel 文件 (.xls) 是否包含宏

    有没有办法以编程方式确定 xls 是否包含宏 而无需在 Excel 中实际打开它 还有什么方法可以检查这些宏是用哪个证书 包括时间戳证书 签名的 再次不使用 Excel 我特别想知道当存在宏时 是否有任何字符串始终显示在 Excel 文件的
  • 在 Android 中取消已经打开的 toast

    我目前正在开始开发 Android 应用程序 并且一直在跟进本教程关于如何使用和改进 Google 地图应用程序 我已经成功地在屏幕上显示地图 触摸后我得到了一个位置的地址 通过反向地理编码 并显示了Toast 但这是我的问题 当您在地图上
  • 使用 DX10 的 D3D 图像

    是否可以将 DirectX 10 我正在使用 SlimDX 与 WPF 的 D3DImage 一起使用 我能找到的唯一示例和文档仅显示使用 DX9 表面 是的 您可以在 WPF 中通过 D3DImage 使用 DirectX 10 11 和
  • 使用 AJAX 获取 html 内容后向新元素添加侦听器的正确方法是什么? (jQuery、Javascript)

    我正在制作一些可以通过 AJAX 加载新设置页面的东西 我不确定将侦听器绑定到新内容页面中的这些元素的最有效方法是什么 这是我的想法 我可以创建一个比较文件路径的函数 对于每个条件 我将根据 AJAX 加载的页面将正确的侦听器应用于这些新元
  • 在 VS Code 终端(即 Windows Powershell)中编译时遇到问题

    当我右键单击 运行代码 并在用户设置中的终端中运行时 我收到这些错误 At line 1 char 63 c Users Josh Documents Programming Learning to Program g Exe The to
  • 如何在存储过程中调用C#函数

    SQL Server 2005 支持 CLR 因此这意味着我们可以在后端使用 CLR 那么如何做到这一点 我在 C 中有一些函数可以对日期时间变量进行一些复杂的操作 现在我想在 SP 中使用这些函数 首先 这是否可以做到 是的 可以在 SQ
  • 如何在 VBA 窗体上显示 Excel 的一部分

    我有一个 csv 格式的文件 从 A S 列 它有一些记录 例如表格 我的完整程序将插入 删除 删除 添加一些行 列和编辑单元格值等 我设法编写了我需要的所有操作的代码 现在我正在尝试将其与图形用户界面集成 我想要的是显示从 Ax1 到 V
  • 对 'GET_LIST' 的响应必须类似于 { data : [...] },但接收到的数据不是数组

    我正在尝试使用ra data simple rest 数据提供商 import React from react import Admin fetchUtils Resource from react admin import simple
  • Jenkins - 我如何将参数从上游传递到下游

    我有 3 个版本 A 是控制流程的主版本 B 另一个构建 C 将在B之后执行 我想向 A 添加一个字符串参数 以便用户手动输入一些字符串 但我不确定如何将此参数传递给 B 可以说这是我的构建流程 构建 B 构建 C 我不知道如何将参数传递给
  • 计算拦截向量

    我有 2 个对象 我将它们称为target and 拦截器 我知道目标的当前位置和速度 我知道拦截器的当前位置和飞行速度 由此 我现在需要知道的是 是否可能进行拦截 即同一时间点的同一位置 拦截弹需要沿着什么矢量飞行 拦截需要多长时间 即每
  • 在 SharedPreferences 中存储字符串数组

    我想知道是否可以在共享首选项中保存一个字符串数组 每次我们保存某个字符串时 我们都会将其存储在该数组中 例如 我有一个具有特定 ID 的位置列表 我想将其标记为收藏夹 理想的情况是 拥有一个数组并在该数组中保存某个位置 ID 我们称之为 L
  • Elixir:不同数量的函数重载

    有没有办法定义具有不同数量的重载函数 例如在 C 中我可以这样做 foo bar or foo bar baz 在 Elixir 中 唯一的方法是将它们放在单独的模块中 这很快就会变得混乱 有什么办法解决吗 编辑 我做了一个错误的假设 我看
  • std::atomic::notify_all 是如何排序的?

    我希望下面的程序不会挂起 如果在 1 中以相反的顺序观察 2 和 3 则可能会因丢失通知而挂起 include
  • 如何在 select2 jquery 中的标记中设置默认值

    我正在使用 select2 http ivaynberg github io select2 作为我的标记输入 从使用 select2 标记的示例中 代码如下所示 e12 select2 tags red green blue 现在我的问题
  • Python字符串模式识别/压缩

    我可以做基本的正则表达式 但这略有不同 即我不知道模式会是什么 例如 我有一个类似字符串的列表 lst asometxt0moretxt bsometxt1moretxt aasometxt10moretxt zzsometxt999mor