第一行输入一个长度为
、由可见字符构成的通配符字符串
。
第二行输入一个长度为
、由可见字符构成的目标字符串
。
如果可以匹配得到,输出
;否则,输出
。
z zz
false
Z* zz
true
在这个样例中,
匹配
。注意,由于不区分大小写,
可以匹配
。
?* zz
true
在这个样例中,
匹配
、
匹配
。
**Z 0QZz
true
在这个样例中,其中一种匹配方法是:
第一个
匹配
;
第二个
匹配
;
第三个
匹配
。
??** zz
true
可以匹配
个字符。
HH?* HH##1
false
可被
和
匹配的字符不包含
。
#正则化,发现会超时,对输入进行了进一步处理降低复杂度就行了 import re while True: try: str1 = input()#记录第一行 str2 = input()#记录第二行 str1 = list(str1) counter=0#初始判定值 for i in range (len(str1)): if str1[i] == "*" and counter ==0: counter = 1#当为相隔后第一个*时,保留此*并继续 elif str1[i] == "*" and counter ==1:#当后续依然为*时,去除多余*因为*本身代表0-n个,从而减小计算复杂度 str1[i] = ""#比如最后一个例子“h*h*ah**ha*h**h***hha” 重复*太多复杂度太大 else: counter=0#一旦不是连续的*则重置判定值 str1=''.join(str1)#合并为str str1 = str1.lower() str2 = str2.lower()#不分大小写,统一小写处理 str1=str1.replace('?', '[0-9 a-z]')#统一小写+数字,不能用\w因为\w包括下划线,别涂省事规规矩矩打上 str1=str1.replace('*','[0-9 a-z]*')#统一小写+数字 *代表0或多个 str1=str1.replace('.','\.' )#由于.本身代表匹配除换行符以外的任意字符,需要转义 str1 = "^"+str1+"$" search = re.match(str1, str2)#这道题用match(),如果是要求匹配整个字符串,直到找到一个匹配的规则的字符串则用search() if search != None: print('true') else: print('false') except: break
def match(i,j,b,a,ma): if i==0&nbs***bsp;j==0: return ma[i][j] if a[j-1]=='*': ma[i][j]=match(i-1,j-1,b,a,ma)&nbs***bsp;match(i-1,j,b,a,ma)&nbs***bsp;match(i,j-1,b,a,ma) return ma[i][j] if a[j-1]=='?' and (b[i-1].isalpha()&nbs***bsp;b[i-1].isdigit()): ma[i][j]=match(i-1,j-1,b,a,ma) return ma[i][j] return (match(i-1,j-1,b,a,ma) and a[j-1]==b[i-1]) while True: try: a = input().lower() b = input().lower() except: break ma=[[False]*(len(a)+1) for i in range(len(b)+1)] ma[0][0]=True if a[0]=='*': ma[0][1]=True if match(len(b),len(a),b,a,ma): print('true') else:似乎题库发生了改变,用动态分析勉强解决了问题。
while True: try: str1 = input() str2 = input() flag = 0 i = 0 j = 0 while i < len(str1): if str1[i] == str2[j]: i += 1 j += 1 elif str1[i] != '?' and str1[i] != '*': flag = 1 break elif str1[i] == '?': i += 1 j += 1 elif str1[i] == '*': if i != len(str1) - 1: if str1[i+1] not in str2[j:] and str1[i+1] != '?': flag = 1 break elif str1[i+1] in str2[j:]: i += 1 j += 1 i += 1 j += 1 if flag == 0: print('true') elif flag == 1: print('false') except EOFError: break
while True: try: a = input() b = input() i, j, k = 0, 0, 1 while i < len(a) and j < len(b): if a[i] == b[j]&nbs***bsp;a[i] == '?': i += 1 j += 1 elif a[i] == '*': if i+1 == len(a): break elif a[i+1] == b[j+1]&nbs***bsp;a[i+1] == '?': i += 1 j += 1 elif a[i+1] == b[j]: i += 1 else: j += 1 else: k = 0 break if k == 0: print('false') else: print('true') except Exception() as e: print(e) break
def match(reg, s): i = 0 flag = False for j, v in enumerate(reg): if v == '*': flag = True continue elif v == s[i]&nbs***bsp;v == '?': i += 1 continue elif flag == True: while s[i] != v: i += 1 if i >= len(s): return 'false' flag = False i += 1 else: return 'false' else: return 'true' while True: try: reg, s = input(), input() print(match(reg, s)) except: break
def error_index(string): # 输出非法字符的位置 ans = [] for i in range(len(string)): c = string[i] if c.isalpha() or c.isnumeric() or c=='*' or c=='?': continue else: ans.append(i) return ans def split_by_index(string, index): # 通过非法符号的位置进行划分 ans = [] index.insert(0, -1) index.append(len(string)) lengh = len(index) for i in range(lengh-1): temp = string[index[i]+1: index[i+1]] if temp!='': ans.append(temp) return ans def error_cmp(str1,str2,index1,index2): # 比较非法字符是否一样 for i,j in zip(index1, index2): if str1[i]!=str2[i]: return False return True def eq(str1, str2): # 比较通配符 str2是纯字母数字 len1, len2 = len(str1), len(str2) if len1!=len2 and '*' not in str1: return False matrix = [[False for j in range(len2)] for i in range(len1)] if str1[0]=='*' or str1[0]=='?': matrix[0][0] = True else: if str1[0]==str2[0]: matrix[0][0] = True for i in range(1, len1): if str1[i]=='*' and matrix[i-1][0]: matrix[i][0] = True else: matrix[i][0] = False # 重点重点重点重点重点重点重点重点重点重点重点重点重点重点重点重点重点 for i in range(1, len1): for j in range(1, len2): if str1[i]=='*': matrix[i][j] = matrix[i-1][j] or matrix[i][j-1] else: matrix[i][j] = matrix[i-1][j-1] and (str1[i]=='?'&nbs***bsp;str1[i]==str2[j]) return matrix[len1-1][len2-1] while True: try: error = 0 expression, todo = input(), input() exp_index, todo_index = error_index(expression), error_index(todo) if len(exp_index)!= len(todo_index) or not error_cmp(expression, todo, exp_index, todo_index): error = 1 break exp_split, todo_split = split_by_index(expression, exp_index), split_by_index(todo, todo_index) for str1,str2 in zip(exp_split, todo_split): if not eq(str1, str2): error = 1 break if error: print('false') else: print('true') except: break
import re while True: try: rule = list(input()) to_be_search = input() for i in range(len(rule)): if rule[i] == '.': rule[i] = '\.' elif rule[i] == '?': rule[i] = '.' elif rule[i] == '*': rule[i] = '.*' res = re.search(''.join(rule), to_be_search) if res: print('true') else: print('false') except: break
import re while True: try: re_str = input() s = input() li = re.findall(re_str.replace('?','.?').replace('*','.*'), s) print('true' if len(li)>0 else 'false') except: break
import re while True: try: a = '^' + input().replace('*', '\w*').replace('?', '\w?') + '$' b = input() print('true') if re.match(a, b) else print('false') except: break
import re while True: try: inp = input().strip() strs = input().strip() #print(strs) inp = inp.replace("?", "\w{1}").replace("*","\w{0,}") pattern = re.findall(inp,strs) #match = pattern.match(strs) if len(pattern)==1 and pattern[0]==strs: print('true') else: print('false') except: break;
/*递归解法,假设string1是带有通配符的字符串,string2是要匹配的字符串,在第i个字符处有三种 情况: 1、两个字符串都是字母的时候,不相等就是false; 2、遇到?通配符的时候,跳过第i个字符,继续匹配从string1[i+1],string2[i+1]开始匹配; 3、遇到“*”通配符,则遍历后面的字符串,根据情况在进行判断; */ def isMatch(string1, string2): for i in range(len(string1)): if string1[i].isalpha(): if string1[i] != string2[i]: return 'false' else: if string1[i] == "?": isMatch(string1[i + 1:], string2[i + 1:]) elif string1[i] == "*": for j in range(i + 1, len(string1)): if string1[j] == '?' or string1 == "*": isMatch(string1[j:], string2[j:]) elif string1[j].isalpha() and string2.isalpha(): if string1[j] == string2[j]: isMatch(string1[j:], string2[j:]) return 'true' while True: try: string1 = input() string2 = input() print(isMatch(string1, string2)) except: break