18

私はPythonを学んでいますが、正規表現を理解できないようです。

r1 = re.compile("$.pdf")
if r1.match("spam.pdf"):
    print 'yes'
else:
    print 'no'

このコードで「はい」を出力したいのですが、頑固に「いいえ」を出力します。また、次のそれぞれを試しました。

r1 = re.compile(r"$.pdf")

r1 = re.compile("$ .pdf")

r1 = re.compile('$.pdf')

if re.match("$.pdf", "spam.pdf")

r1 = re.compile(".pdf")

さらに、数え切れないほどのバリエーション。私はかなり長い間探していましたが、私の問題を解決するものを見つけたり理解したりすることはできません. 誰かが初心者を助けることができますか?

4

5 に答える 5

52

機能するものを除くすべてのバリエーションを試しました。はパターンの最後$に行きます。また、実際にピリオドに一致するように、ピリオドをエスケープする必要があります (通常、ピリオドは任意の文字に一致します)。

r1 = re.compile(r"\.pdf$")

ただし、これを行うためのより簡単で明確な方法は、文字列の.endswith()メソッドを使用することです。

if filename.endswith(".pdf"):
    # do something

そうすれば、何が起こっているのかを理解するために正規表現を解読する必要がなくなります。

于 2012-08-29T23:18:54.240 に答える
25

re.match()との動作re.search()

大きな違いが 1 つあります。文字列の先頭re.match()をチェックします。おそらく.re.search()

両方の方法の比較は、「 search() vs. match()」と呼ばれる Python ドキュメントの章に明確に示されています。

正規表現の特殊文字

また、正規表現の文字の意味は、使用しようとしているものとは異なります (詳細については、正規表現の構文を参照してください)。

  • ^先頭に一致します:

    (キャレット。) 文字列の先頭に一致し、MULTILINE モードでは各改行の直後にも一致します。

  • $末尾に一致します:

    文字列の末尾または文字列の末尾の改行の直前に一致し、MULTILINEモードでは改行の前にも一致します。foo は '<code>foo' と '<code>foobar' の両方に一致しますが、正規表現foo$は '<code>foo' のみに一致します。さらに興味深いことに、'foo1\nfoo2\n' で foo.$ を検索すると、通常は '<code>foo2' に一致しますが、MULTILINEモードでは '<code>foo1' に一致します。$' 'でシングルを検索するfoo\nと、2 つの (空の) 一致が見つかります。1 つは改行の直前、もう 1 つは文字列の末尾です。

完全な答え

お探しのソリューションは次のとおりです。

import re
r1 = re.compile("\.pdf$")  # regular expression corrected
if r1.search("spam.pdf"):  # re.match() replaced with re.search()
    print "yes"
else:
    print "no"

文字列が " " で終わっているかどうかをチェックします.pdf。kindall's answer with と同じことを行います.endswith()が、kindall's answer が機能する場合は、それを選択してください (正規表現がまったく必要ない場合があるため、よりクリーンです)。

于 2012-08-29T23:24:06.160 に答える
8

あなたの質問

$「文字列の終わり」を意味します。したがって、次のような正規表現が必要です\.pdf$

  1. ドット ( .) は正規表現の特殊文字であるため、エスケープされます。
  2. 文字列 " pdf"
  3. 文字列の終わり。

参考文献

正規表現は Python などの言語を超えているため、最初に正規表現に関するチュートリアルを読む必要があります。regular-expressions.infoを検討してください。これは実際には Python に関する質問ではなく、基本的な正規表現に関する質問です。

于 2012-08-29T23:21:49.963 に答える
1

正規表現$.pdfは、「文字列の末尾を見つけてから、任意の文字を検索し、文字列の末尾を超えて任意の文字を超えて、ap、ad、および f を検索する」ことを示しています。

書かれているように、それは賢明に何にも一致することはできません。

ただし、pdf$一致します。

この特定のケースでは、一致は本質的に文字列の先頭に固定されていると思われるため、おそらくsearchではなくa を実行することも必要です。match

于 2012-08-29T23:19:36.767 に答える