1

2 つの文字列を受け取り、それらが一致した場合に true を返す関数をどのように記述しますか (正規表現を使用しません)。

制約は次のとおりです。

  • 文字列 1 (一致するテキスト) には、アルファベットと数字が含まれます。
  • 文字列 2 のパターンは、アルファベット、数字、.および*になります。ここで.、アルファベットまたは数字のいずれかが一致と見なされ*、前の文字が 0 回以上繰り返されることを意味します。

例えば:

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

4 に答える 4

2

あなたが今説明したものは、正規表現と呼ばれます(正規表現.では「何でも」を意味しますが)...これにはすでにライブラリがあります

また、あなたの例は間違っています.."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
于 2012-10-30T17:41:41.670 に答える
2

これを特に誇りに思っているわけではありませんが(@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')

エラーでいっぱいだと思いますが(文字列が a で始まる場合など*)、私のコードは通常そうです。

于 2012-10-30T18:01:58.380 に答える
1

おそらく、正規表現を見たいと思うでしょう。何かが見つかった場合は true を返します。

import re
if re.findall(regex, string):
  print "You found it!"
于 2012-10-30T17:46:41.573 に答える
0

正規表現はリンクに役立ちます

于 2012-10-30T17:42:23.933 に答える