Python en bucle a través de la cadena y la combina con un patrón de comodín

string1="abc" string2="abdabcdfg" 

Quiero encontrar si string1 es subcadena de string2. Sin embargo, hay caracteres comodín como "." puede ser cualquier letra, y puede ser "a" o "d" , x puede ser "b" o "c" . como resultado, ".yx" será la subcadena de string2 .

¿Cómo puedo codificarlo usando solo un bucle? Quiero recorrer a través de string2 y hacer comparaciones en cada índice. Probé el diccionario, pero uso un bucle de mi código:

 def wildcard(string,substring): sum="" table={'A': '.', 'C': '.', 'G': '.', 'T': '.','A': 'x', 'T': 'x', 'C': 'y', 'G': 'y'} for c in strand: if (c in table) and table[c] not in sum: sum+=table[c] elif c not in table: sum+=c if sum==substring: return True else: return False print wildcard("TTAGTTA","xyT.")#should be true 

Sé que estás pidiendo específicamente una solución utilizando un bucle. Sin embargo, supongo que sería un enfoque diferente: puede traducir fácilmente su patrón a una expresión regular . Este es un lenguaje similar para los patrones de cuerdas, simplemente mucho más poderoso. Luego puede usar el módulo re para verificar si esa expresión regular (y por lo tanto su patrón de subcadena) se puede encontrar en la cadena.

 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 = {'.': '[az]', '#': '[ad]', '+': '[bc]'} print re.findall(to_regex('.+#', symbols), 'abdabcdfg') 

Si prefieres una solución más “práctica”, puedes usar esto, usando bucles.

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

La salida en ambos casos es ['abd', 'bcd'] , es decir, se puede encontrar dos veces, usando estas sustituciones.