0
x = "type='text'"
re.findall("([A-Za-z])='(.*?)')", x) # this will work like a charm and produce
                                     # ['type', 'text']

ただし、私の問題は、同じ正規表現が適用されるようにパイプ(代替)を実装したいということです

x = 'type="text"' # see the quotes

基本的に、次の正規表現は機能するはずですが、findall を使用すると奇妙な結果になります。

([A-Za-z])=('(.*?)')|"(.*?)")

また、パイプの代わりに ['"] を使用することはできません。これは、悪い結果で終わる可能性があるためです。

value="hey there what's up?"

では、一重引用符または二重引用符のいずれかに適用されるような正規表現を作成するにはどうすればよいでしょうか? ところで、私は興味がないので、html や xml のパーサーを提案しないでください。

4

2 に答える 2

5

shlexここではより良い仕事をするでしょうが、あなたが主張するならre、使用してください([A-Za-z]+)=(?P<quote>['"])(.+?)(?P=quote)

于 2011-08-01T22:02:34.043 に答える
1

問題は、([A-Za-z]+)=('(.*?)'|"(.*?)")4 つのグループがあり、必要なのは 2 つだけであることです (これはおそらく結果がおかしいと感じた場所です)。使えば([A-Za-z]+)=('.*?'|".*?")大丈夫なはずです。(?:)を入れることでグループ化を除外できることを覚えておいてください([A-Za-z]+)=('(?:.*?)')|"(?:.*?)")

編集:このソリューションには、不要な引用符が含まれることに気付きました。ただし、簡単に剥がすことができます。後方参照を使用することもできますが、その場合、最後に削除する必要がある余分なグループが 1 つあります。次に例を示します。

import re
from operator import itemgetter

x = "type='text' TYPE=\"TEXT\""
print map(itemgetter(0,2), re.findall("([A-Za-z]+)=(['\"])(.*?)\\2", x)) 

を与え[('type', 'text'), ('TYPE', 'TEXT')]ます。

于 2011-08-01T22:05:28.487 に答える