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

时间:2012-10-30 17:34:46

标签: java python string compare character

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

约束如下:

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

例如:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')

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

答案 2 :(得分:1)

您可能想要查看正则表达式。如果他们找到了什么,他们就会回归。

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

答案 3 :(得分:0)

正则表达式可以帮助您link