我正在使用python,但任何语言的代码都可以用于此问题。
假设我有2个字符串。
sequence ='abcd'
string = 'axyzbdclkd'
在上面的示例中,sequence
是string
如何使用正则表达式检查sequence
是string
的子序列?另请查看示例here以了解子序列和子阵列的差异以及我对子序列的含义。
我能想到的唯一想法就是这个,但它远非我想要的。
import re
c = re.compile('abcd')
c.match('axyzbdclkd')
答案 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个结果:abcd
和ab(1b2)cd
。因此,出于测试目的,建议的a(b1)b(2)cd
是可以的(ish),但是对于解析^.*a.*b.*c.*d.*$
将永远是贪婪的。要获得第二个结果,您需要让它变得懒惰:^a(.*)b(.*)cd$
。因此,如果你需要这个用于解析,那么你应该知道预期有多少变量,并优化你需要解析一些示例字符串的正则表达式模式,并将捕获组的间隙只放到你真正需要它们的位置。此高级版本会注入实际变量的模式而不是^a(.*?)b(.*)cd$
,因此例如在第二种情况下为.*
或^ab(\d\w\d)cd$
。