2017-08-05 6 views
0

strptime()関数を使用して、日付時刻と一致させてMM-DD-YYYY形式に変換しようとする、大量のテキスト文字列を処理しています。Python regexの '否定'パターンマッチング

しかし、日付(。)として扱うために私の.findall()関数を誤解しているテキスト(例:90481)には、5桁のシリアル番号があります。どのようにそれらを除外する条件の^()型を含めることによってそれらを避けることができますか?

共通点は5桁であるので、私は試しました^(?!\ d {5})が、うまくいきませんでした。この番号のセットに取り組む最も良い方法は何ですか?

ありがとうございます。

注1:私はthis postを読みましたが、それを得ることはできません。

注2:

05/10/2001; 05/10/01; 5/10/09; 6/2/01 
 
May-10-2001; May 10, 2010; March 25, 2001; Mar. 25, 2001; Mar 25 2001; 
 
25 Mar 2001; 25 March 2001; 25 Mar. 2001; 25 March, 2001 
 
Mar 25th, 2001; Mar 25th, 2001; Mar 12nd, 2001 
 
Feb 2001; Sep 2001; Oct 2001 
 
5/2001; 11/2001 
 
2001; 2015

:日付形式について誰かが多くの日付フォーマットは、たとえば、私が働いているデータフレームであり、コメント欄に

を求めていますですから、私はかなり長い.findall(r ")関数を持っていますが、主なポイントは5桁のシリアル番号を選択しないようにすることです。敬具

+1

あなたのfindAllが最初の場所で働くどのように?完全な正規表現を投稿してください。 –

+0

元の質問スレッドに追加します。 –

+0

もし私があなたに合っている必要があるものを簡単に説明できるのであれば、私はあなたを助けるためにもっとエールかもしれません。日付の時間は多くの書式で書かれているので、正確に何を使っているのか分かりにくいです。 – kpie

答えて

1

あなたが一致するものが複数の数字と途中数見出されることを避けるために、あなたの正規表現で\bを使用することができます。開始位置と終了位置に1つずつ配置し、残りの部分をキャプチャしないグループにラップすることによって、それらが|(OR)操作の範囲に含まれていないことを確認します。

私は短いそれを維持するために、いくつかの数ヶ月削除:

\b(?:\d{1,2}\/\d{1,2}\/\d{2,4}|(?:Jan|Feb|Mar|Apr| |Nov|Dec)[a-z]*-\d{2}-\d{2,4})\b 
+0

これは完全に機能します!どうもありがとうございます。このコンテキストで\ b()\ bがどのように(そしてなぜ)動作するのか聞いてもらえますか? –

+0

'\ b'は、英数字のシーケンスと英数字以外の文字の間の区切りと一致します(文字に一致しません。シーケンスに改行があるだけです)。したがって、一致の最初の文字が数字であると仮定されたとき、最初の '\ b'はその一致した文字の前に数字(または文字またはアンダースコア)がないことを要求します。最後にも同様のことが起こります。 – trincot