如何編寫一個函數接受兩個字符串,如果匹配則返回true(不使用正則表達式)。檢查兩個字符串是否與字母,數字和特殊字符匹配
約束如下:
- 字符串1(以匹配到文本)將具有字母和數字。
- 字符串2的模式將爲字母,數字,
.
和*
,其中.
表示字母或數字將被視爲匹配,並且*
表示前一個字符重複0次或更多次。
例如:
Text: Facebook
Pattern: F.cebo*k
returns True
如何編寫一個函數接受兩個字符串,如果匹配則返回true(不使用正則表達式)。檢查兩個字符串是否與字母,數字和特殊字符匹配
約束如下:
.
和*
,其中.
表示字母或數字將被視爲匹配,並且*
表示前一個字符重複0次或更多次。例如:
Text: Facebook
Pattern: F.cebo*k
returns True
你剛纔所描述的是什麼refered作爲一個正則表達式(雖然.
意味着正則表達式「什麼」)......已經有這個
也是你的例子是錯誤的。作爲"flow"
將不匹配"fl*w"
,但它會匹配"fl.w"
import re
string2=string2.replace(".","[0-9a-zA-Z]")
print re.match(string2,string1)
這裏是一個的statemachine的實現,應適用於所有情況的工作也與*啓動時,除了
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
如何在不使用RE庫的情況下完成這項工作? – user1530318
你需要實現一個狀態機... –
@ user1530318你爲什麼不使用RE庫?這是它是爲... – CoffeeRain
定期expresions將幫助您link
你可能想看看正則表達式。如果他們發現了某些東西,他們會回來
import re
if re.findall(regex, string):
print "You found it!"
不是特別自豪的這個(@ JoranBeasley的回答是最好的),但這個就可以了(貌似)無正則表達式:
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')
我敢肯定,它與錯誤(非難一樣,如果一個字符串以*
開頭),但我的代碼通常是。
那麼酷:)(+ 1)相當不錯的狀態機實現...(基本上)他所要求的......但我不認爲這個問題的目標是實現算法...我認爲這是測試,如果他知道正則表達式的(但我認爲'bo * k'不會匹配'boook',因爲它應該...並且也不會匹配'bk',所以仍然有一些實現細節爲OP –
我會在任何一天從@JoranBeasley獲得+1 +1而且我同意與你的正則表達式點 - 雖然我確定訪問者經常問的問題,似乎知道什麼是正則表達式將會執行一個相對簡單的算法。 – RocketDonkey
@JoranBeasley關於匹配的好點 - 回實驗室:) – RocketDonkey
嘗試查找正則表達式。這不是什麼堆棧溢出是什麼... – CoffeeRain
我認爲你的例子應該返回false ... –
更新了示例 – user1530318