2017-08-11 11 views
0

私は正規表現で私の最初のステップをやっていますが、私はまだ構文について少し混乱しています。私は期間を通じて文の終わりを検出したい。私はすでにこの作業をするためのルールのほとんどを書いていますが、私はまだ日付に関する問題があります。 これは日中にバックラッシュにすべての時間を変更するには、私の式である:これは2012年8月14日だけでなく、14 2012年8月に動作するようになっている日付の出現を正規表現で別の形式に変更

re.sub('\d+\.(\s)?\w+(\.)?(\s)?\d+', '\d+/\w+/\d+', text) 

「は日付を認識するように思えるが、それは勝ちましたそれらを新しい形式に変更しないでください。私は間違って何をしていますか?

乾杯、sub第2引数で

マルセル
+0

をあなたが提供できますあなたがコードを自分で実行するために働いている 'text'の例です。 –

+0

https://www.dropbox.com/s/y54cnq8uomkeg7w/Ernst%20Abbe%20-%20Gesammelte%20Abhandlungen%20III.txt?dl=0 – Marcel

+0

バックリファレンスの使用方法を学びます。しかし、あなたは14歳にしたいですか? 「2012年8月」を「14/8月/ 2012」に変更しますか? –

答えて

0

は、"\d""\w"等正規表現トークンは正規表現自体と同じように解釈されません。

日付をリテラルテキスト"\d+/\w/\d+"に置き換えています。代わりに、あなたは"14/8/2012""14/August/2012""14. August 2012""14.8.2012"のような文字列に置き換えられます

re.sub(r"(\d+)\.\s?(\w+)\.?\s?(\d+)", r"\1/\2/\3", text) 

これを使用する必要があります。

実際の値(曜日、月、年)が必要な場合は、代わりに2番目の引数として関数を渡すことができます。あなたが具体的かつのみヶ月(例えば、8、08、8月、8月は)受け入れられるようにしたい場合は

def replaceValues(match): 
    day = match.group(1) 
    month = match.group(2) 
    year = match.group(3) 

    # add some code here that will do something with day, month, and year 

    return day + "/" + month + "/" + year 

re.sub(r"(\d+)\.\s?(\w+)\.?\s?(\d+)", replaceValues, text) 

することは、あなたは以下のコードを使用することができます

import datetime 
def replaceValues(match): 
    day = match.group(1) 
    month = match.group(2) 
    year = match.group(3) 

    # test if month is ACTUALLY a month 
    formats = ['%m', '%b', '%B'] 
    for format in formats: 
     try: 
      datetime.datetime.strptime(month, format) 
      break 
     except: 
      pass 
    else: 
     # month is not a valid month name 
     return match.group(0) 

    # add some code here that will do something with day, month, and year 

    return day + "/" + month + "/" + year 

re.sub(r"(\d+)\.\s?(\w+)\.?\s?(\d+)", replaceValues, text) 
+1

このような代替は、 "... car#14。In 2012 I ..."のような実際のテキストの例で汚染されている可能性があります。おそらく、datetime.strptimeを使用して、取得された文字列が実際に日付であることを確認するために考えられるトークンを反復する必要があります。 – RebelWithoutAPulse

+1

それは本当です。そんなことは考えてもいなかった。コメントありがとう。私は答えを編集しました。 – ChristianFigueroa

+1

コードについての小さなこと。ネストされた例外処理ではなく、月トークンのリストを反復し、それぞれを解析することをお勧めします。一致した場合は改行、そうでない場合は元の文字列を考慮することは実際には日付ではありません。 – RebelWithoutAPulse