0

私は文字列を持っています、ここで

text='<tr align="right"><td>12</td><td>John</td> 

タプル(「12」、「ジョン」)を抽出したいと思います。私が使用しているときは正常に動作しています

m=re.findall(r'align.{13}(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)

印刷m

しかし、私が使用しているとき、私は( '2'、'John')を取得しています

m=re.findall(r'align.+(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
print m

なぜうまくいかないのですか?。{13}は正常に機能するのに、。+が私のreで機能しないのはなぜですか?ありがとうございました!

4

3 に答える 3

5

これには、実際には適切なHTMLパーサーライブラリを使用する必要があります。

>>> a = '<tr align="right"><td>12</td><td>John</td>'
>>> p = lxml.html.fromstring(a)
>>> p.text_content()
'12John'
>>> p.xpath('//td/text()')
['12', 'John']

明らかに、これは複数の発生に対してより適切に機能する必要があります...

于 2012-12-07T18:50:49.577 に答える
4

あなたが提供したサンプルテキストと正規表現でこれを実際にテストすることはできません。なぜなら、書かれているように、明らかに一致するものが見つからないはずであり、実際、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')]

多田。

于 2012-12-07T18:50:53.020 に答える
0

を使用する.+と、できるだけ多くの文字に一致します。\d+は少なくとも1桁に一致する必要があるだけなので、.+は一致"="right"><td>1"し、「2」のみが一致するようになり\d+ます。

元の例は、サンプルデータに対して機能しています。他のデータで機能する正規表現を作成する必要がある場合は、そのデータの形式と、抽出する部分をどのように決定するかを説明する必要があります。

また、HTMLを解析しているように見えることを考えると、正規表現の代わりにBeautifulSoupのようなものを使用する方がおそらく良いでしょう。

于 2012-12-07T18:50:19.313 に答える