2012-02-21 29 views
0

可能性の重複:私は、文字列と文字列stを与えられています
Search for string allowing for one mismatch in any location of the string1-不一致正規表現

tがすべてsの中にあり、が1つの不一致文字にある正規表現がありますか? (tの文字数は、最大で1文字です。)

+0

それは@Robjong – Robjong

+0

物事が容易になり、データはと遊ぶためにいくつかの例を追加してください:[この](http://stackoverflow.com/questions/2420412/search-for-string-allowing-for-one - mismatch-in-any-string-of-the-string)は、私がやろうとしていることです。 – Randomblue

+0

私はこの問題について専門家はいませんが、最大で1つの不一致を許す変形例を使用することができます:http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – mpen

答えて

1

私は「wouldn必然的にこれは正規表現で行います。あなたはLevenshteinの距離を使うことができます。

>>> import Levenshtein 
>>> s = "spam ham and eggs" 
>>> t = "ram" 
>>> for i,_ in enumerate(s): 
... s_ = s[i:i+len(t)] 
... if Levenshtein.distance(s_, t) == 1: 
...  print s_ 
... 
pam 
ham 
+1

は最適ではありません。 Levenshteinは1つのエラーがあっても数え続けます – mpen

+0

そうですが、Levenshteinの距離はかなり速く、とにかくパフォーマンスに重要なコードではないかもしれません。早すぎる最適化とそのすべて。 – wim

+0

彼のコメントでは、彼は彼がこれをやろうとしていたことを除いて:http://stackoverflow.com/questions/2420412/search-for-string-allowing-for-one-mismatch-in-any-location-of-the -stringはかなり大きなデータセットです。私はこれが時期尚早だとは思わない。 – mpen

1

はい、絶対に。例えば、tならば、そのような正規表現は言っ

.bcde|a.cde|ab.de|abc.e|abcd. 

が、これはtは全く大きい場合は特に、ほぼ確実ないこれを行うための最善のか、最も効率的な方法である、"abcde"です。 (それが大きい場合は、あなたが

a(?:b(?:c(?:d.|.e)|.de)|.cde)|.bcde 

として

.bcde|a(?:.cde|b(?:.de|c(?:.e|d.))) 

または多分としてそれを再定式化することにより、多少その性能を向上させることができますが、それはまだ最善のアプローチではありません。)