Pythonの正規表現を否定する正規表現

Pythonメタキャラクタ否定。

ネットを精練し、いくつかの異なる構文を書いた後、私はアイデアがありません。

いくつかのファイルの名前を変更しようとしています。彼らはタイトルの年を持っています。 [2002]。 括弧はありませんが、私はそれを修正したいのです。

だから私は(^ [\ d4 ^])のようなものに見える正規表現を見つけようとしています。しないでくださいそれらの周りに大括弧があります。私は [\ 1] のような名前を使用して名前を変更できるように、これをバインドするために角括弧を使用しています。

4

1 答え

パターンの周りを確認したい場合は、 lookahead lookbehind アサーションを使用できます。これらは試合の一部を構成するものではありませんが、あなたの周りに見つける(または見つからない)と思われるものを言います。

角括弧が必要ないので、負の見栄えと先読みを使用する必要があります。

A negative lookahead looks like this (?!...) where it matches if ... does not come next. Similarly a negative lookbehind looks like this (? and matches if ... does not come before.

私たちの例は、 \ でエスケープする必要があるので、正規表現で意味を持つ []と[] >。

そこで、次のようなパターンを構築できます。

  • A negative lookbehind for [ - (?
  • Four digits - \d{4}
  • A negative lookahead for ] - (?!\])

これは私たちに次のPythonコードを与えます:

>>> import re
>>> r = re.compile("(?>> r.match(" 2011 ")
>>> r.search(" 2011 ")
<_sre.SRE_Match object at 0x10884de00>
>>> r.search("[2011]")

名前を変更するには、 re.sub a>または sub 関数を使用します。それを動作させるには、グループとしてマークするために年内に追加のブラケットセットを追加する必要があります。

また、置き換えを指定するときにグループを \ 1 として参照するので、 \ をエスケープしたり、生の文字列を使用したりする必要があります。

>>> r = re.compile("(?>> name = "2011 - This Year"
>>> r.sub(r"[\1]",name)
'[2011] - This Year'
うわー、ありがとう。 2 [noobの合計]の質問が発生しますが、おそらく私は新しいスレッドを開始する必要があります。なぜ、 ">>>"プロンプトと "0x10884de00で"私に言っている?
追加された 著者 Dee,
ありがとうございます。私の最初のpythonプログラムには今や翼があり、検索/置換基準に従ってファイルの名前を100に変更したことを嬉しく思います。どうもありがとう!うーん、私は@ usernameのように見えない
追加された 著者 Dee,
@Dee - Python REPLで自分のコードをテストしたので、>>> プロンプトが表示されます。コマンドラインで引数なしで python とタイプすれば、一度に1行ずつPythonコードを実行できるインタラクティブなシェルができます。値 0x10884de00 は何も教えてくれません。重要なのは、 r.search( "2011")が一致オブジェクトを返したため、 r.search( "[2011]")マッチはありませんでした。
追加された 著者 Dave Webb,