Python循环遍历字符串并将其与通配符模式匹配

时间:2014-07-10 13:03:03

标签: python string loops python-2.7 wildcard

string1="abc"
string2="abdabcdfg"

我想找到string1是否是string2的子串。但是,有"."之类的通配符可以是任意字母,y可以是"a""d"x可以是"b"或{ {1}}。 因此,"c"将是".yx"的子字符串。

如何仅使用一个循环对其进行编码?我想循环遍历string2并在每个索引处进行比较。我试过字典,但我想使用循环 我的代码:

string2

1 个答案:

答案 0 :(得分:1)

我知道你特意要求使用循环解决方案。但是,我想假设一种不同的方法:您可以轻松地将模式转换为regular expression。这是一种类似于字符串模式的语言,功能更强大。然后,您可以使用re模块检查是否可以在字符串中找到该正则表达式(以及子字符串模式)。

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')

如果您更喜欢“动手”解决方案,可以使用循环来使用它。

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'))

两种情况下的输出都是['abd', 'bcd'],即使用这些替换可以找到两次。