为了账号安全,请及时绑定邮箱和手机立即绑定

使用正则表达式匹配图形间隔

使用正则表达式匹配图形间隔

潇潇雨雨 2023-01-04 16:42:16
假设我有一组数字:arr=[1, 2, 3, 4, 5, 4, 3, 2, 1]。常规正则表达式将其基本单位/文字作为字符。我想知道是否有一种方法可以将“对象”作为基本单位,用于 object [a,b]。现在我想回答这个问题,“是否arr包含至少 2 个长度为 3 且具有正梯度的区间?” . 我在想我可以通过用[a,b]对象替换字符来模仿正则表达式,其中a是间隔的大小,是在该间隔 ( )b上运行的函数。gradient_pos该函数将返回True或False取决于是否满足条件。例如,要回答上述问题,您会查询:[3,gradient_pos]{2,}您将看到语法遵循所有正则表达式规则,除了我们不是查看字符,而是查看[a,b]有效评估为Trueor的对象False。这个想法是,正则表达式会尝试匹配满足gradient_pos. 那有意义吗?我知道这很抽象,但如果有人能帮助我实现这样的目标,我将不胜感激!谢谢!
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

您可以将其视为正则表达式问题。所以你的数组会变成:


import numpy as np

arr=[1, 2, 3, 4, 5, 4, 3, 2, 1]

arr = np.array(arr)

arr_as_str=''.join(map(str,np.sign(arr[1:]-arr[:-1])+1))

我得到了不包括最后一个元素的梯度,并将sign函数从 (-1,+1) 转移到 (0,2)。这样做的原因是为了避免字符串表示中的减号。

所以现在你可以像往常一样应用正则表达式匹配:

  • 负梯度:0

  • 零梯度:1

  • 正梯度:2

您的“3 个连续正梯度”查询将如下所示:

matches=list(re.finditer('(?=(2{3}))',arr_as_str))

由于存在重叠的正则表达式匹配项,因此您必须像以下那样使用先行查找: Python regex find all overlapping matches?

您可以使用起始索引引用原始数组,而且您知道序列有多长:

matches[1].start()

我建议使用这种方法是因为您似乎对正则表达式很满意。但是,如果您有兴趣探索其他方法,我建议您查看形态过滤,这将是我的第一选择


查看完整回答
反对 回复 2023-01-04
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信