正则表达式子序列匹配

时间:2017-03-02 12:25:46

标签: python regex

我正在使用python,但任何语言的代码都可以用于此问题。

假设我有2个字符串。

sequence ='abcd'
string = 'axyzbdclkd'

在上面的示例中,sequencestring

的子序列

如何使用正则表达式检查sequencestring的子序列?另请查看示例here以了解子序列和子阵列的差异以及我对子序列的含义。

我能想到的唯一想法就是这个,但它远非我想要的。

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

对于任意sequence构造一个正则表达式,您可以:

import re

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

将{ - {1}}导致正则表达式'abcd'。然后,您可以使用'a.*b.*c.*d'

re.find(..)

使用the_string = 'axyzbdclkd' if rgx.search(the_string): # ... the sequence is a subsequence. pass 您肯定知道原始re.escape(..)中的'.'将被翻译为sequence,因此与任何性格。

答案 2 :(得分:0)

不要将正则表达式用于此类事情:

a = set('abcd')
b = set('axyzbdclkd')

a.issubset(b)

答案 3 :(得分:0)

我不认为解决方案就像@schwobaseggl声称的那样简单。让我向您展示数据库中的另一个序列:from collections import defaultdict o = [[1,2],[3,4],[2,3],[5,4]] def group_lists(list_of_lists): ''' Given a list of lists, continue combining sublist elements that share an element until no two sublist items share an element. ''' to_cluster = set(tuple(i) for i in list_of_lists) keep_clustering = True while keep_clustering: keep_clustering = False d = defaultdict(set) for i in to_cluster: for j in i: d[j].add(i) clustered = set() for i in d.values(): # remove duplicate entries from each cluster flat = tuple(set([item for sublist in i for item in sublist])) clustered.add(flat) if not to_cluster == clustered: keep_clustering = True to_cluster = clustered # done clustering! return clustered print(group_lists(o)) 。通过使用ab1b2cd子序列进行模式匹配,您可以获得2个结果:abcdab(1b2)cd。因此,出于测试目的,建议的a(b1)b(2)cd是可以的(ish),但是对于解析^.*a.*b.*c.*d.*$将永远是贪婪的。要获得第二个结果,您需要让它变得懒惰:^a(.*)b(.*)cd$。因此,如果你需要这个用于解析,那么你应该知道预期有多少变量,并优化你需要解析一些示例字符串的正则表达式模式,并将捕获组的间隙只放到你真正需要它们的位置。此高级版本会注入实际变量的模式而不是^a(.*?)b(.*)cd$,因此例如在第二种情况下为.*^ab(\d\w\d)cd$