0

次の「greekSymbols.txt」があります

Α α alpha
Β β beta
Γ γ gamma
Δ δ delta
Ε ε epsilon
Ζ ζ zeta
Η η eta
Θ θ theta
Ι ι iota
Κ κ kappa
Λ λ lambda
Μ μ mu  
Ν ν nu
Ξ ξ xi
Ο ο omicron
Π π pi
Ρ ρ rho
Σ σ sigma
Τ τ tau
Υ υ upsilon
Φ φ phi
Χ χ chi
Ψ ψ psi
Ω ω omega

これを区切り文字としてタブを使用して Anki プレーン テキスト ファイルに変換しようとしていました。各行を 2 枚のカードに変換していました。表は記号 (大文字または小文字) で、裏は名前です。私は次のものを持っています。

#!/usr/local/bin/python

import re

pattern = re.compile(r"(.)\s+(.)\s+(.+)", re.UNICODE)

input = open("./greekSymbols.txt", "r")

output = open("./greekSymbolsFormated.txt", "w+")

line = input.readline()

while line:

    string = line.rstrip()

    m = pattern.match(string)

    if m:
        output.write(m.group(1) + "\t" + m.group(3) + "\n")
        output.write(m.group(2) + "\t" + m.group(3) + "\n")
    else:
        print("I was unable to process line '" + string + "' [" +  str(m) + "]")

    line = input.readline()

input.close();
output.close();

残念ながら、現在、すべての行で「処理できませんでした...」というメッセージが表示され、str(m) の値は None です。私は何を間違っていますか?

> localhost:Anki stephen$ python ./convertGreekSymbols.py 
I was unable to process line 'Α α   alpha' [None]
I was unable to process line 'Β β   beta' [None]
...
4

4 に答える 4

5

これには正規表現は必要ありません。

with (open("./greekSymbols.txt") as infile, 
      open("./greekSymbolsFormated.txt", "w+") as outfile):
    for line in infile:
        up, low, name = line.split()
        outfile.write("{0}\t{1}".format(up,name))
        outfile.write("{0}\t{1}".format(low,name))

正規表現に固執したい場合は、あなたの代わりに次の正規表現を試してください(これはIMOで機能するはずですが、おそらく十分に明示的ではありません):

pattern = re.compile(r"(\S+)\s+(\S+)\s+(.+)", re.UNICODE)
于 2013-04-09T05:43:41.847 に答える
2

間違っているのは空白の解析だと私には思えます。(.)\s(.)\s(.+)ではなく、すべきではありません\tか?入力にタブがないようです。

于 2013-04-09T05:42:14.710 に答える
2

タブがない場所に \t があります。\s である必要があります。

>>> matcher = re.compile(r"(.)\s(.)\t(.+)", re.UNICODE) 
>>> phi = "Φ φ phi" 
>>> matcher.match(phi)
>>> matcher = re.compile(r"(.)\s(.)\s+(.+)", re.UNICODE)
>>> matcher.match(phi)
<_sre.SRE_Match object at 0x1018d8290>
>>>
于 2013-04-09T05:43:26.593 に答える
0

これが最終的に機能するようになったコードです。元のファイルは utf-8 だったようで、これが問題を引き起こしていました。これは、Anki 用の /t 区切りのインポート ファイルを作成できる実用的なソリューションです。

#!/usr/local/bin/python

import re
import codecs

pattern = re.compile(r"(\S+)\s+(\S+)\s+(.+)", re.UNICODE)

input = codecs.open("./greekSymbols.txt", "r", encoding="utf-8")

output = codecs.open("./greekSymbolsFormated.txt", "w+", encoding="utf-8")

line = input.readline()

while line:

    string = line.rstrip()

    m = pattern.match(string)

    if m:
        output.write(unicode(m.group(1) + "\t" + m.group(3) + "\n"))
        output.write(unicode(m.group(2) + "\t" + m.group(3) + "\n"))
    else:
        print("I was unable to process line '" + string + "' [" +  str(m) + "]")

    line = input.readline()

input.close();
output.close();
于 2013-04-09T08:17:28.670 に答える