Python looping through string and matching it with with wildcard pattern

后端 未结 1 2000
礼貌的吻别
礼貌的吻别 2021-01-25 10:52
string1=\"abc\"
string2=\"abdabcdfg\"

I want to find if string1 is substring of string2. However, there are wildcard characters like \".\"

相关标签:
1条回答
  • 2021-01-25 11:09

    I know you are specifically asking for a solution using a loop. However, I would suppose a different approach: You can easily translate your pattern to a regular expression. This is a similar language for string patterns, just much more powerful. You can then use the re module to check whether that regular expression (and thus your substring pattern) can be found in the string.

    def to_regex(pattern, table):
        # join substitutions from table, using c itself as default
        return ''.join(table.get(c, c) for c in pattern)
    
    import re
    symbols = {'.': '[a-z]', '#': '[ad]', '+': '[bc]'}
    print re.findall(to_regex('.+#', symbols), 'abdabcdfg')
    

    If you prefer a more "hands-on" solution, you can use this, using loops.

    def find_matches(pattern, table, string):
        for i in range(len(string) - len(pattern) + 1):
            # for each possible starting position, check the pattern
            for j, c in enumerate(pattern):
                if string[i+j] not in table.get(c, c):
                    break # character does not match
            else:
                # loop completed without triggering the break
                yield string[i : i + len(pattern)]
    
    symbols = {'.': 'abcdefghijklmnopqrstuvwxyz', '#': 'ad', '+': 'bc'}
    print list(find_matches('.+#', symbols, 'abdabcdfg'))
    

    Output in both cases is ['abd', 'bcd'], i.e. it can be found two times, using these substitutions.

    0 讨论(0)
提交回复
热议问题