1

これがPython(2.6.5)のバグであるか、正規表現を作成する能力であるか、またはパターンマッチングの理解であるかを発見するのを手伝ってください。

(考えられる答えは「Pythonをアップグレードする」であることを受け入れます。)

私はYubikeyトークンを解析しようとしており、オプションの追加機能を考慮に入れています。

この正規表現を使用して、オプションの追加機能なしで(つまり、2つのキャプチャグループに一致するもののみを含む)トークンを一致させると、一致は失敗します。

r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'

ただし、最初のグループを欲張りでないものにすると、次のようになります。

r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32}?)\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'

成功します。

それで、OK、それは機能していますが、これら2つの正規表現の最終結果の唯一の違いはパフォーマンスだと思いました。

ExpressoとRegexCoachは、どちらも両方のパターンが好きです。

私は何を逃しましたか?


これが私がテストしている2つの文字列です。

オプションの追加機能(失敗する可能性のあるもの)はありません:

"vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"

オプションのエクストラを使用する場合(これまでのところ失敗していません。実際のタブはここでは「_」として表示されます):

"_!_8R5Gkruvfgheufhcnhllchgrfiutujfh_"
"_!1U4Knivdgvkfthrd_brvejhudrdnbunellrjjkkccfnggbdng_"

Alex Martelliからの提案を使用して再現しようとしましたが、生のPython環境では失敗しないので、コードを再検討します(実際には、yubikey-pythonをハッキングしています)。一日かそこらで報告します。


皆様、お詫び申し上げます。問題を再現できません。getpassそれが起こったとき、私は;を介して入力を読んでいました。偶発的な外国のキーストロークが邪魔になったのではないかと思います。

質問を閉じます。質問に賛成した人が投票を削除したい場合、それは公正です。

本当にごめんなさい。

4

2 に答える 2

3

私はyubikeyにインターフェースするPythonにyubikey-pythonを使用することをお勧めします-しかし、それは副次的な(そして厳密に実用的な)問題です;-)。

理論的には、欲張りと非欲張りのどちらかを選択すると、あるケースではREが一致し、別のケースでは失敗するというケースはありません。一致するかどうかではなく、一致するもの(およびパフォーマンスについて言及した場合)にのみ影響するはずです。 REは目的のためにバックトラックすることになっているので、まったく成功します。

問題は、問題を再現できないことです。手元にyubikeyがなく、このファイルのテストでは、2つのREの一致/不一致の動作に違いはありません。

失敗した例をいくつか投稿してください(一方が一致し、もう一方が一致しない場合)。理想的には質問を編集して、問題を再現し、最小限に抑えるようにしてください。REのバグがあるように聞こえますが、再現可能なケースがないと、修正されたかどうか、いつ修正されたか、すでに報告されているか、または何であるかを確認できません。ありがとう!

OPを編集すると、失敗した例が1つ投稿されましたが、それでも再現できません。

$ py26
Python 2.6.5 (r265:79359, Mar 24 2010, 01:32:55) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r1 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$')
>>> r2 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32}?)\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'
... )
>>> nox="vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"
>>> r1.match(nox)
<_sre.SRE_Match object at 0xcc458>
>>> r2.match(nox)
<_sre.SRE_Match object at 0xcc920>
>>> 

つまり、一致はどちらの場合も成功するはずです。これは、OPが使用している2.6.5Pythonバージョンとまったく同じです。OP、pls、プラットフォームでのこの単純なコマンドシーケンスの結果を表示し、プラットフォームに依存する奇妙なバグのように見えるため、プラットフォームが何であるかを正確に教えてください...ありがとう!

于 2010-08-01T16:12:03.430 に答える
0

その通りです。欲張りな数量詞から欲張りでない数量詞に切り替えるだけで、正規表現が機能しなくなることはありません。正規表現が一致する(または一致しない)速度、一致する量、およびどのグループでどの部分がキャプチャされるかを変更できます。それだけです

(次の「解決策」は適用されませんが、大文字と小文字を区別しない一致が実行されていることを示すものではないため、そのままにしておきます。)

問題は、オプションのエクストラを含む文字列にも大文字が含まれており、正規表現では小文字しか使用できないことです。前面または正規表現にa(?i)を貼り付けると、問題なく機能します。

于 2010-08-01T17:23:32.503 に答える