0

数字と2種類の文字a'|'と。が散在する単語を含む大きなテキストファイルがあり'.'ます。StackOverflowで検索したところ、この文字列を取得して文字のみを保持する方法が見つかりました。たとえば、

old_fruits='apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'

それから

re.sub("[^A-Za-z]","",old_fruits)

戻るだろう

'applekiwibananapear'

私はこれらの単語をファイルに書き出そうとしています。各行に1つの単語があり、その後に改行が続き、次の単語が続きます。

apple
kiwi
banana
pear

どんな考えや正しい方向を指し示しても大歓迎です。

4

5 に答える 5

1

これを試して:

import re

old_fruits = 'apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'

with open('fruits.out', 'w') as f:
    fruits = re.findall(r'[^\W\d]+', old_fruits)
    f.write('\n'.join(fruits))
于 2012-08-13T03:41:38.883 に答える
1

正規表現を使用せずにこれを行うことができます。パイプ文字で文字列を分割し、ジェネレータ式とinbuildstring.isalpha()関数を使用して、アルファベット文字のみの単語を除外し、それらを結合して最終出力を形成します。

old_fruits = 'apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'
words = (word for word in old_fruits.split('|') if word.isalpha())
new_fruits = '\n'.join(words)

print(new_fruits)

出力は

apple
kiwi
banana
pear

必要に応じて(ファイルに書き込まれませんが、それに対処できると思います)。

編集:簡単なスクリプトをノックアップして、正規表現と非正規表現のタイミング比較を提供します。

import timeit

# Setup - not counted in the timing so it doesn't matter we include regex for both tests
setup = r"""old_fruits = 'apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'
import re
fruit_re=re.compile(r'[^\W\d]+')
"""

no_re = r"""words = (word for word in old_fruits.split('|') if word.isalpha())
new_fruits = '\n'.join(words)"""

with_re = r"""new_fruits = '\n'.join(fruit_re.findall(old_fruits))"""

num = 10000

print("Short input")
t = timeit.timeit(no_re, setup, number=num)
print("No regex: {0:.2f} microseconds to run".format((t*1e6)/num))
t = timeit.timeit(with_re, setup, number=num)
print("With regex: {0:.2f} microseconds to run".format((t*1e6)/num))

print("")
print("100 times longer input")

setup = r"""old_fruits = 'apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'*100
import re
fruit_re=re.compile(r'[^\W\d]+')"""

t = timeit.timeit(no_re, setup, number=num)
print("No regex: {0:.2f} microseconds to run".format((t*1e6)/num))
t = timeit.timeit(with_re, setup, number=num)
print("With regex: {0:.2f} microseconds to run".format((t*1e6)/num))

私のコンピューターでの結果:

Short input
No regex: 18.31 microseconds to run
With regex: 15.37 microseconds to run

100 times longer input
No regex: 793.79 microseconds to run
With regex: 999.08 microseconds to run

したがって、プリコンパイルされた正規表現は短い入力文字列でより高速になり、長い入力文字列ではジェネレーター式がより高速になります(少なくとも私のコンピューター(Ubuntu Linux、Python 2.7)では結果が異なる場合があります)。

于 2012-08-13T03:52:58.610 に答える
0

OPのコードを基礎として使用する:

import re
old_fruits = 'apple|0.00|kiwi|0.00|0.5369|-0.2437|banana|0.00|pear'

with open('outdata.txt', 'w') as f:
    f.write('\n'.join(re.sub("[^A-Za-z]"," ",old_fruits).split()))

与える

apple
kiwi
banana
pear

ファイル内'outdata.txt'

于 2012-08-13T03:38:07.373 に答える
0

答えはそれほど難しくありません。これがベストプラクティスかどうかはわかりませんが、なぜですか。

print re.sub("[^A-Za-z]+","\n",old_fruits) #re.sub("[^A-Za-z]+","\n",old_fruits) is the string you want

「+」は、非英字の1つ以上のインスタンスが\nに置き換えられることを意味します

于 2012-08-13T03:39:18.380 に答える
0
of=old_fruits.split("|")
for i in range(0,len(of),2):
 # write to file
于 2012-08-13T03:40:58.920 に答える