2017-07-10 18 views
1

ファイルを読み込み、すべての行が\ d + \ sで始まる行を見つける方法を教えてください。そして、書き込み空間を、。いくつかの行には英字が含まれています。しかし、行の一部は中国語です。私は中国のエンコーディングのスペースは英語とは違っていますか?Python 2.7パターンが一致した場合に行を検索し、文字列を置き換えます。

例(TEXT.TXT)

asdfasdf 
1 abcd 
2 asdfajklsd 
3 asdfasdf 
4 ... 
asdfasdf 
66 ... 
aasdfasdf 
99 ... 
100 中文 
101 中文 
102 asdfga 
103 中文 

私のテストコード:

with open('text.txt', 'r') as t: 
    with open('newtext.txt', 'w') as nt: 
      content = t.readlines() 

      for line in content: 
        okline = re.compile('^[\d+]\s') 
          if okline: 
          ntext = re.sub('\s', ',', okline) 
          nt.write(ntext) 
+0

すべてのスペースをカンマで置き換えますか?単に 'str.replace'を使わないのはなぜですか? –

+1

're.compile'オブジェクトの存在をなぜチェックするのか分かりません。常にtrueを返します。つまり、 'okline = re.match(r '\ d + \ s'、line)'ですか? –

+0

@COLDSPEED スペースを置き換える前に、すべての行が数字で始まることがわかります。私のサンプルファイルが示すように、いくつかの行は数字で始まっていません。これらの行はnewtext.txtに保存されません – Enoch

答えて

0

あなたはこれを行うことができます:

# Reading lines from input file 
with open('text.txt', 'r') as t: 
    content = t.readlines() 

# Opening file for writing 
with open('newtext.txt', 'w') as nt: 

    # For each line 
    for line in content: 

     # We search for regular expression 
     if re.search('^\d+\s', line): 

      # If we found pattern inside line only then can continue 
      # and substitute white spaces with commas and write to output file 
      ntext = re.sub('\s', ',', line) 
      nt.write(ntext) 

あなたのコードで複数の問題がありました、初心者のため\dは文字クラス、基本的には\d[0-9]と同じですので、角括弧の中に入れる必要はありません。 regex demo hereが表示されます。また、コンパイル操作が成功したため、コンパイルオブジェクトがTrueであるかどうかをチェックしていました。コンパイルオブジェクトは常にTrueになります。

さらに、withステートメントを入れ子にしないでください。より多くのPythonの方法は、withを使用してファイルを開いてそれを閉じます。単一re.subn()機能付

+0

ありがとうございます。なぜ0バイトのnewtext.txtを出力するのかわからない。 – Enoch

+0

Np。 :)あなたは私の答えを受け入れることができますか? https://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow –

+0

@Enoch typoがありました。あなたは 'content = t.readlines()'をコピーしましたか? –

1

with open('text.txt', 'r') as text, open('newtext.txt', 'w') as new_text: 
    lines = text.read().splitlines() 
    for l in lines: 
     rpl = re.subn(r'^(\d+)\s+', '\\1,', l) 
     if rpl[1]: 
      new_text.write(rpl[0] + '\n') 

本の主な利点は、re.subnnumber_of_subs_madeが決定的な値が必要なマッチライン時に作られた置換を指しているタプル(new_string, number_of_subs_made)を返すということです

+0

はい、それは仕事です!しかし、それは英語の文字でのみ動作します。実際には、いくつかの行には漢字が含まれています。漢字を含む行には失敗します。申し訳ありませんが、私はプログラミングの初心者です。 – Enoch

0

コンパクトコード

import re 

with open('esempio.txt', 'r') as original, open('newtext2.txt', 'w') as newtext: 
    for l in original.read().split('\n'): 
     if re.search("^\d+\s",l): 
      newtext.write(re.sub('\s', ',', l)+'\n') 
関連する問題