あなたが提供したサンプルテキストと正規表現でこれを実際にテストすることはできません。なぜなら、書かれているように、明らかに一致するものが見つからないはずであり、実際、2.7と3.3の両方で一致するものが見つからないからです。
しかし、欲張りでない一致が必要だと思います。に変更.+
する.+?
と、問題が何であれ修正されます。
Jon Clementsが彼の回答で指摘しているように、ここでは正規表現を使用するべきではありません。Regexpsは、XMLのような非正規言語を実際に解析することはできません。もちろん、純粋主義者の言うことにもかかわらず、正規表現は、迅速で汚い場合に、非正規言語の有用なハックになる可能性があります。しかし、機能していないものに遭遇するとすぐに、最初にすべきことは、これはそれらの迅速で汚いケースの1つではない可能性があると考え、実際のパーサーを探す必要があります。これまでAPIやXPathを使用したことがない場合でも、ElementTree
習得は非常に簡単で、学習に費やした時間は、将来何度も役立つので、間違いなく無駄になりません。
しかしとにかく…あなたのサンプルをあなたが説明するように機能するものに減らして、これが何をするか見てみましょう:
>>> text='<tr align="right"><td>12</td><td>John</td>
SyntaxError: EOL while scanning string literal
>>> text='<tr align="right"><td>12</td><td>John</td>'
>>> re.findall(r'align.{13}(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
[]
>>> re.findall(r'align.{13}(\d+).*([A-Z]\w+)', text)
[('12', 'John')]
>>> re.findall(r'align.+(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
[]
>>> re.findall(r'align.+(\d+).*([A-Z]\w+)', text)
[('2', 'John')]
これがあなたが不満を言っていたものだと思います。まあ、.+
「正しく動作していない」ではありません。それはあなたが要求したことを正確に実行します:少なくとも1つの文字、そして可能な限り多くの文字を、式の残りの部分がまだ一致するものを持っているところまで一致させます。これには1
、式の残りの部分がまだ一致しているため、の一致が含まれます。
代わりに、式の残りの部分が引き継ぐことができるとすぐに一致を停止したい場合、それは貪欲な一致ではなく、貪欲でない一致であるため、+?
ではなく必要です+
。試してみよう:
>>> re.findall(r'align.+?(\d+).*([A-Z]\w+)', text)
[('12', 'John')]
多田。