2016-03-22 21 views
2

私はPythonで部分正規表現マッチングについて質問しています。例については部分正規表現マッチング

string = 'foo bar cat dog elephant barn yarn p n a' 

そして、正規表現:あなたは、文字列がある場合

pattern = r'foo bar cat barn yard p n a f' 

を次のことが真のようになります。

  • re.match(pattern, string)Noneを返します。我々は、すべてのパターンの最初の部分が文字列の最初の部分と一致していることを見ることができますが
  • re.search(pattern, string)None

を返します。

文字列内のパターン全体を検索する代わりに、パターンに一致する文字列の割合を確認する方法はありますか?

+0

パターンが一致する必要があります。その一部をオプションにしたい場合は '?'を使います。 python doc(https://docs.python.org/3.5/library/re.html)やhowto(https://docs.python.org/3.5/howto/regex.html)を見てください。たとえば、 'pattern = r'foo bar cat(納屋庭p n a f)? ' –

+0

私は知っている:)。質問は、**完全に検索する代わりに、一致の代わりにパーセンテージを返す別の方法があるかどうかを尋ねていました。 – Signal

+0

最終的に正規表現モジュールを見ることができます:https://pypi.python.org/pypi/regexこれはファジーマッチ機能を提供します。 –

答えて

2

正規表現ではありません。

from difflib import SequenceMatcher 
SequenceMatcher(None, string, pattern).ratio() 
# => 0.7536231884057971 

あなたも、言葉ではなく、文字を一致させることができます:**まったく**

SequenceMatcher(None, string.split(), pattern.split()).ratio() 
# => 0.7368421052631579 
+0

ありがとうございます*これは私が探していたものです! – Signal

0

私が知っているregexライブラリでは不可能ですが、ステートマシンにアクセスして一度に1文字ずつ進めると可能です。

正規表現をステートマシンにコンパイルするのはちょっと難しいですが、ステートマシンを実行するのは簡単なことではありません。どんなステッピングでも実行できます。一例として、mine is here

これは、「今後の入力によっては一致する可能性があります」から「競合によって一致しません」という文字から何パーセントに切り替わるかを示すことができますが、それは本当にあなたが望むものです)。