1

正規表現は、はいまたはいいえの質問に答えます - 文字列がパターンに一致しますか。

いいえを 2 つのカテゴリに分けたいと思います。

  • 有効な文字列のプレフィックスである無効な文字列
  • 有効なプレフィックスではない無効な文字列

例を次に示します (正規表現01+2):

  • 012有効です

  • 12無効です; 有効な文字列のプレフィックスではありません

  • 01無効です; これは有効な文字列のプレフィックスです:012

Java はこれを行うことができます。

これはできreますか?そうでない場合、この区別を行うことができるライブラリはありますか?

4

3 に答える 3

5

私は正規表現の推奨に二番目です。モジュールは単に素晴らしいです。

正規表現を使用したあいまい一致の例を次に示します。

import regex

# traditional matching - three digits
r = '(?:\d\d\d)'
print regex.findall(r, '1xx22yy333zz')
## ['333']

# fuzzy matching - three digits, allow at most 2 deletions
r = '(?:\d\d\d){d<3}'
print regex.findall(r, '1xx22yy333zz')
## ['1', '22', '333']

その{d<3}部分は基本的に「それに1つまたは2つの文字を追加すると、それが一致する」と述べています-ポイント3.と同じです。

詳細については、 http://pypi.python.org/pypi/regexを参照してください (「おおよその「ファジー」マッチング」を探してください)。

于 2012-04-05T17:26:57.127 に答える
2

私はあなたが本当に欲しいものを言うことができません。インクリメンタルマッチを理解しようとしていますか?

おそらく、アンカーを適切に使用する方法を学ぶ必要があります。matchesJavaのメソッドの代わりに誤った名前の欺瞞的なメソッドを使用してはならないのと同じように、 findPythonのmatchメソッドを避けて、まったくsearch同じ理由でを使用する必要があります。

もう1つの可能性は、成功を検査できるオプションの部分を使用してパターンを書き直すことです。

または、 Matthew Barnettの置換regexライブラリのあいまい一致サポートを調べる必要があります。これは、古いものの代わりに実際reに使用する必要があります。

必要な入力と出力の例を示していないため、実際に何を求めているのかわかりません。

編集

おそらく、これ以上複雑なもの(?=.*(?:ab|bc)).*a?b?c?や、間隔を空けたものは必要ありません。

 (?x)
 (?= .* (?: ab | bc) )
 .*
 a? b? c?

、、を再帰的なサブグループに入れるabc繰り返す必要さえありません。

于 2012-04-05T17:08:46.443 に答える
2

私が間違っている場合は訂正してください。元の質問は次のとおりです。一部の正規表現と入力文字列について、入力文字列が一致する可能性がある場合(つまり、文字列の末尾に文字を追加すると一致する可能性があります)。

したがって、あいまい一致は答えではありません。理由は次のとおりです。

rgx = regex.compile('(abcdef){d <5}')

str ='bcd'

同様に試合になります

Boost C ++ライブラリ(Java / Javascriptの場合も?)は、そのようなオプションを提供します: http ://www.boost.org/doc/libs/1_31_0/libs/regex/doc/partial_matches.html

では、Pythonでこれを実現するための最良の方法を知っている人はいますか?

于 2012-10-20T14:36:56.707 に答える