2

ファイルに対して複数のフィルターを使用しています (Python を使用しています)。それらのいくつかはglob フィルターであり、いくつかは正規表現です。大文字と小文字を区別するグロブと正規表現の両方があります。translateを使用して、グロブを正規表現に変換できます。

大文字と小文字を区別する正規表現を 1 つの大きな正規表現に結合できます。それを R_sensitive と呼びましょう。

大文字と小文字を区別しない正規表現を 1 つの大きな正規表現 (大文字と小文字を区別しない) に結合できます。それを R_insensitive と呼びましょう。

R_insensitive と R_sensitive を 1 つの正規表現に結合する方法はありますか? 式は(もちろん)大文字と小文字を区別しますか?

ありがとう、

イウリアン

注: 式を組み合わせる方法は次のとおりです。

R1、R2、R3 正規表現を使用すると、R = (R1)|(R2)|(R3) になります。

例:

「*.txt」(インセンシティブ グロブ) を検索しています。しかし、次のような別のグロブがあります: "*abc*" (大文字と小文字を区別)。一方が大文字と小文字を区別せず、もう一方が大文字と小文字を区別する場合、「fnmatch.translate」から得られた2つの正規表現を(プログラミングから)どのように組み合わせるのですか?

4

2 に答える 2

2

残念ながら、あなたが説明する正規表現機能は、序数修飾子または修飾子スパンのいずれかです。Python はどちらもサポートしていませんが、次のようになります。

序数修飾子:(?i)case_insensitive_match(?-i)case_sensitive_match

モディファイア スパン:(?i:case_insensitive_match)(?-i:case_sensitive_match)

Python では、どちらも での解析に失敗しますre。あなたができる最も近いこと(単純または小さな一致の場合)は、文字グループです:

[Cc][Aa][Ss][Ee]_[Ii][Nn][Ss][Ee][Nn][Ss][Ii][Tt][Ii][Vv][Ee]_[Mm][Aa][Tt][Cc][Hh]case_sensitive_match

明らかに、このアプローチは、鈍感な部分が非常に短い場合に最適です。

于 2013-10-31T22:46:19.297 に答える
1

必要なのは、大文字と小文字を区別しないフラグ付きの正規表現を、フラグなしで同等に機能する正規表現に変換する方法です。

これを完全に一般的に行うことは、悪夢になるでしょう。

結果のためだけにこれを行うfnmatchのは、はるかに簡単です。

完全な Unicode の大文字と小文字の規則を処理する必要がある場合でも、それは非常に困難です。

c各文字も一致することを確認するだけで処理する必要がある場合はc.upper()c.lower()非常に簡単です。

簡単なケースについてのみ説明します。これは、例を考えると、おそらくあなたが望むものであり、簡単だからです。:)

Python 標準ライブラリの一部のモジュールは、サンプル コードとして機能するだけでなく、実際に実装することを目的としています。これらのモジュールのドキュメントは、ソース コードへの直接のリンクから始まります。そしてfnmatch、そのようなリンクがあります。

regexp 構文と glob 構文を理解し、関数のソースを見れtranslateば、独自の関数を作成するのは非常に簡単なはずtranslatenocaseです。

基本的に:文字クラスを構築するための内側のelse句で、文字を反復処理し、文字ごとにif c.upper() != c.lower()、の代わりに両方を追加しますcelse次に、非特殊文字の外側の句でif c.upper() != c.lower()、これらの 2 文字で構成される 2 文字の文字クラスを追加します。

したがって、のようなものではなく、 のようなtranslatenocase('*.txt')ものを返します。しかし、通常はもちろん通常を返します。そして、どうやらすでに方法を知っているように、代替を使用するだけでこれらを組み合わせることができます。r'.*\.[tT][xX][tT]'r'.*\.txt'translate('*abc*')r'.*abc.*'

于 2013-10-31T22:20:49.630 に答える