Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过跳过字符来匹配字符串/序列_Python_Regex_String - Fatal编程技术网

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,如果答案解决了您的问题