检查两个字符串是否与字母、数字和特殊字符匹配



如何编写一个接收两个字符串并在它们匹配时返回true的函数(不使用正则表达式)。

限制条件如下:

  • 字符串1(要匹配的文本)将有字母和数字
  • 字符串2,即模式,将是字母、数字、.*,其中.表示字母或数字将被视为匹配,*表示前一个字符重复0次或更多次

例如:

Text: Facebook
Pattern: F.cebo*k
returns True

对此并不感到特别自豪(@JoranBeasley的答案是最好的),但如果没有regex:,这(似乎)会起作用

def Matcher(pattern, text):
comp = zip(pattern, text)
for i, vals in enumerate(comp):
if vals[0] != vals[1]:
if vals[0] == '.' and vals[1].isalnum():
continue
elif vals[0] == '*' and vals[1] == comp[i-1][0]:
continue
else:
return False
return True
print 'F.cebo*k -> Facebook'
print Matcher('F.cebo*k', 'Facebook')
print 'St.c.koverflow -> Stackoverflow'
print Matcher('St.c.koverflow', 'Stackoverflow')
# And for nostalgia...
print 'St.ckoverfl*w -> Stackoverfllw'
print Matcher('St.ckoverfl*w', 'Stackoverfllw')

我确信它充满了错误(比如字符串以*开头),但我的代码通常是.

您刚才描述的内容被称为正则表达式(尽管.在正则表达式中的意思是"任何东西")。。。。这个已经有一个库了

你的例子也是错误的。。因为"flow"将不匹配"fl*w",但是它将匹配"fl.w"

import re
string2=string2.replace(".","[0-9a-zA-Z]")
print re.match(string2,string1)

这里有一个状态机实现,它应该适用于所有情况,除非它以*开头

def matcher(pat,txt):
last = None
try:
for ltr in txt:
if ltr == pat[0]:
pat = pat[1:] #consume
elif pat[0] == "*" and ltr == last:
#dont consume
continue # dont change last
elif pat[0] == "*" and ltr == pat[1]:
pat = pat[2:] #consume 2 (* + whatever)
elif pat[0] =="*"  and last == ".":
continue #dont consume and dont change last 
elif pat[0] == ".":
pat = pat[1:]#consume
elif pat[1] == "*"  and ltr == pat[2]:
pat = pat[3:] #consume 3 (x*X)
else:
return False
last = ltr
except IndexError:
return False #there was a problem that made it break ... it also doesnt match
if not pat or pat == "*":
return True
return False
print "Matching Pattern bo*k"
for word in "boak,bok,book,booooooook,boo,bk".split(","):
print word ," ?=",matcher("bo*k",word)

输出

Matching Pattern bo*k
boak  ?= False
bok  ?= True
book  ?= True
booooooook  ?= True
boo  ?= False
bk  ?= True

您可能想要了解正则表达式。如果他们发现了什么,他们就会返回真实。

import re
if re.findall(regex, string):
print "You found it!"

正则表达式将帮助您链接

相关内容

  • 没有找到相关文章

最新更新