1

私はいくつかのファイルを見つけるためにスクリプト (Python) で作業しています。ファイルの名前を正規表現パターンと比較します。ここで、"~" (チルダ) で終わるファイルを見つける必要があるため、次の正規表現を作成しました。

if re.match("~$", string_test):
    print "ok!"

Python は正規表現を認識しないようです。理由はわかりません。他の言語で同じ正規表現を試してみましたが、完全に機能します。

PD: 挿入しなければならない Web を読みました

# -*- coding: utf-8 -*-

しかし、役に立ちません:(。

どうもありがとう、それまでの間、何かを見つけられるかどうかを確認するために読み続けます。

4

4 に答える 4

10

re.match()正規表現が入力文字列の先頭で一致する場合にのみ成功します。部分文字列を検索するには、re.search()代わりに次を使用します。

if re.search("~$", string_test):
    print "ok!"
于 2010-07-12T06:13:08.340 に答える
9

あなたの正規表現は文字列 "~" と (信じられないかもしれませんが) "~\n" のみに一致します。

re.match(r".*~$",whatever) が必要です ... これは、0 個以上の (改行を除く) の後にチルダが続き、その後に (end-of-string または改行が末尾に続くことを意味します)ストリング)。

万一、ファイル名に改行が含まれる可能性がある場合は、re.DOTALL フラグを使用し、$ の代わりに \Z を使用してください。

他の言語で「働いた」:検索機能を使用したに違いありません。

文字列定数の先頭の r は生のエスケープを意味します。たとえば、'\n' は改行ですが、r'\n' は 2 文字で、バックスラッシュの後に n が続きます。これは '\n' で表すこともできます。生のエスケープは正規表現で多くを節約し\\ます。自動的に r"regex" を使用する必要があります

ところで:この場合、正規表現の混乱を避けてください... whatthing.endswith('~') を使用してください

于 2010-07-12T06:13:51.807 に答える
7

ファイルを見つけるには、glob代わりに次を使用します。

import os
import glob

path = '/path/to/files'
os.chdir(path)
files = glob.glob('./*~')

print files
于 2010-07-12T06:19:19.743 に答える
0

正しい正規表現とglob解決策は既に投稿されています。別のオプションは、fnmatchモジュールを使用することです。

import fnmatch
if fnmatch.fnmatch(string_test, "*~"):
    print "ok!"

これは、正規表現を使用するよりも少し簡単です。ここに掲載されているすべてのメソッドは本質的に同等であることに注意してください。fnmatch正規表現を使用して実装されglobfnmatch.

2009 年になって初めて、改行を含むファイル名のサポートを追加するパッチが(6 年後!) に追加されたことに注意してください。fnmatch

于 2010-07-12T07:27:04.217 に答える