Python 通过跳过字符来匹配字符串/序列
将字符串与多个子字符串匹配:可以直接匹配子字符串,也可以跳过字符进行匹配 比如说, 输入-Python 通过跳过字符来匹配字符串/序列,python,regex,string,Python,Regex,String,将字符串与多个子字符串匹配:可以直接匹配子字符串,也可以跳过字符进行匹配 比如说, 输入-AABCCAADABDC 子字符串-AABA和BDC AABA和BDC是有效序列: BDC是直接匹配 AABA通过跳过C 如何通过跳过字符来匹配子字符串?感谢您的帮助。定义匹配(输入顺序,子字符串,阈值=2): def match(input_seq, substring, threshold=2): ''' Accepts @param: input_seq and @para
AABCCAADABDC
子字符串-
AABA
和BDC
AABA
和BDC
是有效序列:
是直接匹配BDC
通过跳过AABA
C
定义匹配(输入顺序,子字符串,阈值=2):
def match(input_seq, substring, threshold=2):
'''
Accepts @param: input_seq and
@param: substring to check if
substring pattern is present
in @input_seq
'''
is_direct_match = substring in input_seq
if is_direct_match:
return True
substring_idx = 0
input_seq_idx = 0
input_seq_revisit_idx = 0
is_matching = False
num_char_miss = 0
while(input_seq_idx < len(input_seq)):
substring_char = substring[substring_idx]
input_seq_char = input_seq[input_seq_idx]
input_seq_idx = input_seq_idx + 1
if substring_char == input_seq_char:
if not is_matching: # first character matched
is_matching = True
input_seq_revisit_idx = input_seq_idx
substring_idx = substring_idx + 1
elif is_matching:
num_char_miss = num_char_miss + 1
if num_char_miss > threshold: # reset and start a new search
num_char_miss = 0
substring_idx = 0
input_seq_idx = input_seq_revisit_idx
is_matching = False
if substring_idx == len(substring):
break
# print(input_seq_char, substring_char, input_seq_char == substring_char, is_matching, num_char_miss)
is_skip_match = substring_idx == len(substring)
return is_skip_match
if __name__ == "__main__":
input_seq = "AABCCCAADAAABCCABDC"
substrings = ["AABA", "BDC", "AEABA"]
for substring in substrings:
is_valid_seq = match(input_seq=input_seq, substring=substring, threshold=2)
result = "is a valid"
if not is_valid_seq:
result = "is not a valid"
print("{} {} sequence in {}".format(substring, result, input_seq))
'''
接受@param:input_seq和
@param:检查
存在子字符串模式
在@input_seq中
'''
是否直接匹配=输入序列中的子字符串
如果是直接匹配:
返回真值
子字符串_idx=0
输入顺序idx=0
输入顺序重新访问idx=0
是否匹配=错误
num\u char\u miss=0
while(input_seq_idxthreshold:#重置并开始新的搜索
num\u char\u miss=0
子字符串_idx=0
输入顺序idx=输入顺序再访问
是否匹配=错误
如果子字符串_idx==len(子字符串):
打破
#打印(输入顺序字符、子字符串字符、输入顺序字符==子字符串字符、匹配、未命中)
is_skip_match=substring_idx==len(substring)
返回为“跳过”匹配
如果名称=“\uuuuu main\uuuuuuuu”:
输入\ seq=“AABCCCAADAAABCCABDC”
子字符串=[“AABA”、“BDC”、“AEABA”]
对于子字符串中的子字符串:
有效吗?顺序=匹配(输入顺序=输入顺序,子字符串=子字符串,阈值=2)
result=“是有效的”
如果无效,则如下所示:
result=“不是有效的”
打印(“{}{}}序列,格式为{}”。格式(子字符串、结果、输入顺序))
上述代码使用中的检查直接匹配。对于跳过匹配,每个字符都与输入序列匹配。如果子字符串中的所有字符在输入序列中不匹配,则该序列无效
如果你有任何疑问,请告诉我
快乐编码。定义匹配(输入顺序,子字符串,阈值=2):
'''
接受@param:input_seq和
@param:检查
存在子字符串模式
在@input_seq中
'''
是否直接匹配=输入序列中的子字符串
如果是直接匹配:
返回真值
子字符串_idx=0
输入顺序idx=0
输入顺序重新访问idx=0
是否匹配=错误
num\u char\u miss=0
while(input_seq_idxthreshold:#重置并开始新的搜索
num\u char\u miss=0
子字符串_idx=0
输入顺序idx=输入顺序再访问
是否匹配=错误
如果子字符串_idx==len(子字符串):
打破
#打印(输入顺序字符、子字符串字符、输入顺序字符==子字符串字符、匹配、未命中)
is_skip_match=substring_idx==len(substring)
返回为“跳过”匹配
如果名称=“\uuuuu main\uuuuuuuu”:
输入\ seq=“AABCCCAADAAABCCABDC”
子字符串=[“AABA”、“BDC”、“AEABA”]
对于子字符串中的子字符串:
有效吗?顺序=匹配(输入顺序=输入顺序,子字符串=子字符串,阈值=2)
result=“是有效的”
如果无效,则如下所示:
result=“不是有效的”
打印(“{}{}}序列,格式为{}”。格式(子字符串、结果、输入顺序))
上述代码使用
中的检查直接匹配。对于跳过匹配,每个字符都与输入序列匹配。如果子字符串中的所有字符在输入序列中不匹配,则该序列无效
如果你有任何疑问,请告诉我
快乐的编码。看看Hi@Genesis,欢迎来到SO。你想用正则表达式来解决这个问题,还是可以接受任何解决方案?@user13427216我知道正则表达式,但我不知道如何跳过字符,这也是一个棘手的问题,因为我不知道在编写正则表达式时匹配哪个序列,它是从列表中动态获取的查看Hi@Genesis,欢迎使用SO。你想用正则表达式来解决这个问题,还是可以接受任何解决方案?@user13427216我知道正则表达式,但我不知道如何跳过字符,这也很棘手,因为我不知道在编写正则表达式时匹配哪个序列,它是从列表中动态获取的谢谢,这很有效!我最初的用例实际上有一个字符串列表,我设法使您的代码适应这个列表。但是,有没有办法设置跳过字符的阈值?如果一个有效序列之间有两个以上的无效字符,我希望程序停止匹配并转到下一个序列是的,可以这样做。我将修改函数,使AABA
在aabccadaabccabdc
中是有效序列,AABA
在aabccadaabdc
中不是阈值2的有效序列。希望这能解决问题。@Genesis,如果答案解决了您的问题