2

「cmd.exe」というファイルが「System32」フォルダまたはそのサブフォルダにないファイルパス文字列に一致する正規表現パターンを見つけようとしています。

パターンはこれに一致する必要があります:

C:\Tools\calc.exe

しかし、これではありません:

C:\Windows\System32\calc.exe
C:\Windows\System32\De-de\calc.exe

私は後ろをネガティブに見てみました:

(?<![Ss]ystem32)\\calc\.exe
(?<![Ss]ystem32).*\\calc\.exe
(?<![Ss]ystem32[.*])\\calc\.exe

しかし、これまでのところ何も機能しませんでした。誰かが私のエラーを見ますか?

私の例を見て、ここで試してみることができます:http: //rubular.com/r/syAoEn7xxx

ご協力いただきありがとうございます。

4

4 に答える 4

5

質問の正規表現の側面に答えるために、問題はre可変長のルックビハインドをサポートしていないことです。

rx = r'(?<!System32.*)calc.exe'
re.search(rx, r'C:\Tools\calc.exe')

> sre_constants.error: look-behind requires fixed-width pattern

2つの回避策があります。

それをサポートする(そしてはるかに多くの)新しい正規表現モジュールをインストールして使用します。

rx = r'(?<!System32.*)calc.exe'
print regex.search(rx, r'C:\Tools\calc.exe')  # <_regex.Match object at 0x1028dd238>
print regex.search(rx, r'C:\Windows\System32\calc.exe') # None

または、式の後ろに変数が必要ないように式を言い換えます。

rx = r'^(?!.*System32).*calc.exe'
print re.search(rx, r'C:\Tools\calc.exe')  # <_sre.SRE_Match object at 0x10aede238>
print re.search(rx, r'C:\Windows\System32\calc.exe') # None
于 2013-03-26T10:02:46.213 に答える
1

os.pathファイル名を操作するときは、-moduleの関数を使用する必要があります。

私は提案します:

from os.path import basename, dirname

paths = [r"C:\Tools\calc.exe",
         r"C:\Windows\System32\calc.exe",
         r"C:\Windows\System32\De-de\calc.exe"]

good_paths = [p for p in paths if basename(p).lower() == "calc.exe"
                               and not "system32" in dirname(p).lower()]

コアはリスト内包表記であり、 (パスの最後の部分)と、含まれているディレクトリの名前をpathsチェックします。basenamedirname

于 2013-03-26T09:55:59.480 に答える
0

正規表現なしでそれを行うことができます。

def iter_good_paths(list_of_paths):
    for path in list_of_paths:
        parts = path.lower().split(r'\')
        if parts[-1] == 'calc.exe' and 'System32' in parts:
            yield path

次のように使用します。

print list(iter_good_paths(list_of_paths)) 
于 2013-03-26T09:49:34.290 に答える
0

可変幅のものは言うまでもなく、ここで後読みする必要はありません。代わりに先読みを使用してください。

(?i)^(?:(?!\\System32\\).)*\\calc\.exe$

\system32\これは、目的の文字列の前に 大文字と小文字を区別しない文字列を含まないものと一致し\calc.exeます。式の(?i)一部により、右側のすべてで大文字と小文字が区別されなくなります(これがWindowsファイルシステムの場合は、おそらく適切な方法です)。

私はregular-expressions.infoをお勧めしたいと思います。これは、多くの癖やフレーバーで正規表現を学習するための優れたリソースです。

于 2013-03-26T09:55:31.740 に答える