次の2つの制約を満たす、二重引用符で囲まれたすべての部分文字列を見つけたいと思います。
私のコードは以下の通りです:
import re
pat = '"(http.+?\.(jpg|bmp))"' # I don't how to modify this pattern
reg = re.compile(pat)
aa = '"http:afd/aa.bmp" :tt: "kkkk" ++, "http--test--http:kk/bb.jpg"'
print reg.findall(aa)
私の期待する出力は
['http:afd/aa.bmp', 'http:kk/bb.jpg']
しかし、実行結果は
[('http:afd/aa.bmp', 'bmp'), ('http--test--http:kk/bb.jpg', 'jpg')]
私はすでにいくつかの種類のパターンを試しましたが、それでも私が望むものを得ることができません。
期待する結果を得るには、コードをどのように変更する必要がありますか?ありがとう!
[^"]*
最初の後に否定文字クラスを使用して、"
二重引用符で囲まれた部分文字列内にとどまります(注-これは、文字列にエスケープシーケンスがなく、最後http
に到達した場合にのみ機能し、最後に追加して、末尾に到達します"
。
import re
pat = r'"[^"]*(http.*?\.(?:jpg|bmp))[^"]*"'
reg = re.compile(pat)
aa = '"http:afd/aa.bmp" :tt: "kkkk" ++, "http--test--http:kk/bb.jpg"'
print reg.findall(aa)
# => ['http:afd/aa.bmp', 'http:kk/bb.jpg']
パターンの詳細:
"
-文字通りの二重引用符[^"]*
- 0+二重引用符以外の文字できるだけ多くいるので、*
ある貪欲数量詞(http.*?\.(?:jpg|bmp))
-以下にre.findall
一致するグループ1(で抽出):
http
-リテラル部分文字列 http
.*?
-任意の0+文字、できるだけ少ない(よう*?
である怠惰な数量詞)\.
-リテラルドット(?:jpg|bmp)
-re.findall
いずれかjpg
またはbmp
部分文字列に一致する非キャプチャグループ(一致するテキストを出力できないようにするため)[^"]*
-可能な限り多く、二重引用符以外の0文字以上"
-文字通りの二重引用符この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加