2012-03-05 9 views
1

私は異なる言語の単語でファイルを持っています。私はすべてのファイルで同じ構造を持つようにPythonプログラミング言語を使用してそれらを解析したいと思います。 現在、ファイルは目標がFW、それらのすべてがPythonで国際的な単語でファイルを解析する方法

** word 

私はすでにいくつかのコードは、FR、一つのファイルからの読み込み、および新しいものへの書き込みをしているように書かれていことです

1. word1 
24. word2 
- word3 
word4 
** word5 

のような行を含みますこのように

for line in fr: 
     match = re.search(r'^\*\* .*', line) 
     if match: 
     fw.write(line) 

私には2つの質問があります。

最初の質問です。どのように正規表現を書いて、それはアルファ文字から始まる行を探して、アルファ文字の前にあるすべてを削除するでしょうか?

私はこの

fw.write(re.sub(r'(^([^a-zA-Z].*)([a-zA-Z])*.*)', "** \1", line)) 

のように試してみましたが、それは動作しません。

2番目の質問です。文字列がアルファベットで始まるかどうかを確認する方法。私は試しました

print line[0].isalpha() 

返すか?それを最初にUnicodeにする必要がありますか?

ありがとうございます。

+0

2つの質問:どの言語を処理しますか?ファイルはどのようにエンコードされていますか? – georg

+0

@ thg435、それはタイトルとタグで言及されていますが、Python言語です。エンコーディングタイプをどのように見つけることができますか?それはasciiのように見えます。 – yart

+0

あなたは「__different languages__の単語」と言っています - これはどれですか?ファイルにöまたはßまたはæのようなものが含まれていますか? – georg

答えて

0

を捕獲1文字以上続く0以上の非文字が可能行のいずれかにマッチしてみ意味する

​​

:としてそれを使用[a-zA-Z]

の代わりにこれを入れて次に、残りの行をあなたの興味のある単語として収集します。

pat = re.compile(r'^(\d+\. |- |\*\*)?(?P<word>.*)') 

最初のグループは、可能な接頭辞を(あなたの代わりにリテラルスペースの1つ以上のスペースのためにそれを修正したい場合があります)を定義します。第2の名前付きグループが単語を取得します。

+0

@Pirce、コメントしていただけますか?なぜ1が指定されていますか?あなたは数字、つまり\ d *を意味しましたか? 何ですか?手段?拡張? – yart

+0

はい、私は数字ではなく\ d +と言っていました。私は間違いをしたので1が指定されています。 ?最初の括弧内のグループ分けが0または1を意味した後(単語はあるが接頭辞は扱わない)?P は、文字列タグを与えてその中で一致するものを識別する方法です(この場合は2番目)グループ。 – Pierce

0

インポートcodecsモジュールと、あなたのファイルは、言語が混在している場合は

fp = codecs.open(filename, encoding='utf-8') 

でファイルを開き、これは右である可能性が最も高いです。そうでない場合は、どのエンコーディングを使用するべきかを把握してください。これはあなたにユニコードを与え、あなたのREは正しく働くことを望むでしょう。

+0

これは私が更新されたコードを開始しようとしたところです。fw.write(行) UnicodeEncodeError: 'ascii'コーデックは、位置5の文字u '\ u0432'をエンコードできません:範囲内の序数(128) – yart

+0

codecs.open(utf-8エンコーディング)も書いています。 – alexis

+0

指定しました fr = codecs.open(ファイル名、 'r'、エンコーディング= 'utf-8') fw = codecs.open(os.path.basename(filename)+ "_udpated"、 "w"、encoding = 'utf-8') 結果ファイルを開くと、多くのファイルが表示されます。 **^ のレコードです。 – yart

2

文字のunicodeプロパティは、\pLです。グループ内の1

+0

私はfw.write(re.sub(r'(^([^\pL]*.*)([\pL])*.*)', "** \1", line))に回線を変更しましたが、結果ファイルに** ^Aのように表示されます。 – yart

+0

@yart:文字列または文字以外の文字列で開始しますか? – Toto

+0

結果の文字列は のようになります。**単語 は2つの開始を意味し、次にスペースとアルファ文字のみを含む単語を意味します。また、数字や - または_も意味しません。 – yart

関連する問題