【问题标题】:Regex subsequence matching正则表达式子序列匹配
【发布时间】:2018-05-26 07:13:49
【问题描述】:

我正在使用 python,但任何语言的代码都可以解决这个问题。

假设我有 2 个字符串。

sequence ='abcd'
string = 'axyzbdclkd'

在上面的例子中sequencestring的子序列

如何使用正则表达式检查sequence 是否是string 的子序列?还要检查示例here 以了解子序列和子数组的差异以及子序列的含义。

我能想到的唯一想法就是这个,但这与我想要的相差甚远。

import re
c = re.compile('abcd')
c.match('axyzbdclkd')

【问题讨论】:

  • 你今天已经问过这个问题了...
  • 是的,但是还有其他工作,所以无法回复,所以关闭它并现在问,因为我手头有一些时间:-P..

标签: python regex


【解决方案1】:

只允许介于两者之间的任意字符串:

c = re.compile('.*a.*b.*c.*d.*')
# .* any character, zero or more times

【讨论】:

  • 这只有在sequence 不包含任何特殊字符时才有效。
  • @WillemVanOnsem 是的,但我只有小写字符
  • 如果模式变长,输入很大,回溯很可能会导致“崩溃”。
  • @WiktorStribiżew 模式最多大约 20 个字符,字符串大约 50-100 个字符.. 可以吗?..
【解决方案2】:

您可以为任意sequence 构造一个正则表达式,例如:

import re

sequence = 'abcd'
rgx = re.compile('.*'.join(re.escape(x) for x in sequence))

这将 - 对于'abcd' 导致正则表达式'a.*b.*c.*d'。然后你可以使用re.find(..):

the_string = 'axyzbdclkd'
if rgx.search(the_string):
    # ... the sequence is a subsequence.
    pass

通过使用re.escape(..),您可以确定例如原始sequence 中的'.' 将被转换为'\.',因此不匹配任何 字符。

【讨论】:

    【解决方案3】:

    我认为解决方案并不像@schwobaseggl 声称的那么简单。让我向您展示您数据库中的另一个序列:ab1b2cd。通过使用abcd 子序列进行模式匹配,您可以获得2 个结果:ab(1b2)cda(b1)b(2)cd。因此,出于测试目的,建议的^.*a.*b.*c.*d.*$ 可以(ish),但对于解析^a(.*)b(.*)cd$ 将始终是贪婪的。要获得第二个结果,您需要使其变得懒惰:^a(.*?)b(.*)cd$。因此,如果您需要它进行解析,那么您应该知道预期有多少变量并优化正则表达式模式,您需要解析一些示例字符串并将捕获组的间隙仅放在您真正需要的位置。其高级版本将注入实际变量的模式,而不是 .*,例如第二种情况下的 ^ab(\d\w\d)cd$^a(\w\d)b(\d)cd$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2013-12-30
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多