2011-01-30 18 views
1

条件付き検索と置き換えが必要な場合は、10MBを超える大きなテキストファイルがあります。 "a"の後の文字が "r"または "m"または "n"または "u"の場合、ファイル内の "a"のすべてのインスタンスを "ā"に置き換えます。例えばファイル内の条件付き検索と置換Python

: 入力ファイル

Hamro sano ghar holata. 

出力ファイル

Hāmro sāno ghār holata. 

EDIT

みんなありがとう、うまく動作するようです。しかし、インド語スクリプトのような非ラテン文字で動作していないよう:ラテン文字用 ワーキングスクリプト:(デーヴァナーガリー用)

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
import re 
input = "Hamro sano ghar holata." 
regex = re.compile(ur'a([rmnu])') 
print regex.sub(ur'ā\1', input) 

SCRIPT1は

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
import re 
input ="संगम" 
regex = re.compile(ur'ं([कखगघ])') 
print regex.sub(r'ङ्\1', input) 

スクリプト2(追加Unicodeのものを動作していません)

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
import re 
input =u"संगम" 
regex = re.compile(ur'ं([कखगघ])', re.UNICODE) 
print regex.sub(r'ङ्\1', input) 

の予想される出力を動作していない:ंंそのすなわち、次のようगसङ्गम

ङ्に置き換えます
+0

Hmm。私はあなたがユニコードとしてファイルを読むことに問題があると思う。私はいくつかのUnicode情報で私の答えを更新しました。 – steveha

+0

いいえ、実際にあなたの主な問題は、最後の行に「u」が見つからないということです...しかし、あなたがDevanāgarīで働いている場合は、私の更新された答えを参照してください。 – simon

+0

user537488、あなたがそれを稼働させるときに答えの1つを受け入れることを忘れないでください。私はサイモンの答えは受け入れるのが最良だと思う。 – steveha

答えて

3

ここでは単純な正規表現が必要です。このようなもの?

>>> import re 
>>> input = "Hamro sano ghar holata." 
>>> regex = re.compile(ur'a([rmnu])') # the part in parens is remembered 
>>> print regex.sub(ur'ā\1', input) # replace by ā plus remembered part 
Hāmro sāno ghār holata. 

編集:最初

いくつかの背景:

これはDEVANAGARIはるか厳しいタスクである(देवनागरी)、しないため符号化が、合成のためのルールためグリフは非常に複雑です(少なくとも、latinスクリプトの標準によって)。私はこの回答をChromeで書いていますが、これはまだ "Devanāgarī"のためのDevanāgarīを正しく構成できません(間違った場所に 'e'の発音記号が入ります - それはdipthongと同じです'ai')。

テキストレンダリングエンジンでこれらのグリフを組み合わせる方法を「合字」といいます。Devanāgarīについては、技術的には非常に複雑です。あなたは(saṃdhi - 再び、Chromeのレンダリングが間違った場所にアヌスヴァーラを表しビンドゥを取得します)संधिによって導入され、さらに巨大な合併症を追加した場合、あなたはここで何をしようとしていることがわかりますすぐに非常にを得ることが困難です。

あなたの問題がこの単純なケースに限定されていれば、私はそれがきれいにできると思います。ユニコードは、明確にするため、値をエスケープして:

>>> import re 
>>> inputString = u"संगम" 
>>> regex = re.compile(ur'\u0902(?=[कखगघ])') 
>>> print regex.sub(ur'ङ\u094d', inputString) 
सङ्गम 

は、正規表現では、私はアヌスヴァーラヴィラーマhalantヒンディー語)に置き換えられました。合字が動作する方法を考えると、これはいくつかのケースを見逃す可能性がありますが、これを可能な限り軽減するために、@ Kabieの例(これはおそらくより良い選択です)のように、先読みを使用するように私の例を切り替えました。

+0

Unicodeインドスクリプトでは動作しません。 – user537488

+0

今すぐもう一度試してみてください:) – simon

2
re.sub(r'a(?=[rmnu])',r'ā',"Hamro sano ghar holata.") 
+0

これはどうやって説明できますか?とこれを使用する方法? – user537488

+1

>>> re(r'a(?= [rmnu]) '、r'ā'、 "Hamro sano ghar holata") トレースバック(最新のコール最後): ファイル ""、行1 、in NameError:名前 're'が定義されていません – user537488

+1

subを使用するには、事前に 'import re'を追加する必要があります。 – Marii

1

大きなテキストファイルの場合は、元のファイルをコピーし、文字を置き換えて、新しいファイルを更新された行で書き込む必要があります。ファイル全体ではなく、一度に1つのチャンクを読み込む必要があります。 (現代のコンピュータでは、10 MB全体を一度にスラーすることができますが)

これを行う簡単な方法は、ファイルオブジェクトをイテレータとして使用することです。これは一度にファイルから1行を返します。

import re 
pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed 

f = open("corrected_file.txt", "wb") 

for line in open("big_file_10mb.txt", "rb"): 
    line = pat.sub(ur'ā\1', line) 
    f.write(line) 

f.close() 

あなたが一度でファイル全体を読ましたい場合は、.read()メソッドの機能を使用することができます:あなたが正当な理由がない限り

f = open("big_file_10mb.txt", "rb") 
s = f.read() # read entire file contents 
f.close() 
s = pat.sub(ur'ā\1', s) # replace over entire file contents 
f = open("corrected_file.txt", "wb") 
f.write(s) # write entire file contents 
f.close(s) 

は、このようにそれをしないでください。ライン指向のバージョンは、ファイルがコンピュータ上で利用可能なメモリに比べて大きいときには理解しやすく、より良く機能します。あなたはUnicodeを読んで、Unicode文字を置き換えたい

http://diveintopython3.ep.io/regular-expressions.html

:Pythonのの中へ

ブックダイブは、正規表現について説明している章があります。ファイルのネイティブエンコーディングを調べて読み込み、Unicodeに変換して、置換を行い、適切なエンコーディングで書き出す必要があります。または、特別な「コーデック」モジュールを使用することもできます。 codecs.open()は自動的に変換するファイルオブジェクトを提供します。

http://docs.python.org/howto/unicode.htmlそれでは、あなたが読みたいテキストファイルはUTF-8でエンコードされていることを想定してみましょう:

はここで、「ハウツー」Python用文書はUnicodeです。私はこれがあなたのために働くと思う:

import codecs 
import re 

pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed 

f = codecs.open("corrected_file.txt", mode="wb", encoding="utf-8") 

for line in codecs.open("big_file_10mb.txt", mode="rb", encoding="utf-8"): 
    line = pat.sub(ur'ā\1', line) 
    f.write(line) 

f.close() 
+0

ファイル "./WORKING.py"、行11 open line( "big_file_10mb.txt"、モード= "rb"、エンコード= "utf-8"): ^ SyntaxError:無効な構文 – user537488

+0

私は混乱しています。なぜこれはうまくいかないのですか? – user537488

+0

申し訳ありませんが、私は間違いました。今修正されました。普通の組み込みの 'open()'ではなく、 'codecs.open()'を使いたいと思っています。組み込み関数には 'encoding ='機能がありません。編集された答えに示されているように、 'codecs.open()'を使ってください。 – steveha

関連する問題