読者です 読者をやめる 読者になる 読者になる

言語処理100本ノック 03-04

100knock

03. 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

解答

import re
a = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
l = re.split('\W+',a)
print([len(i) for i in l])

単語に分解するのってsplit()でいいのかなと思ったけれど,カンマが残って困った.
どうやら正規表現を使えばいいとのこと(解答はそれ調べて書いた).
割とうまく書けたような気もする.

複数の区切り文字を用いて文字列を分割する(re.split)

string を、pattern があるたびに分割します。キャプチャグループの丸括弧が pattern で使われていれば、パターン内のすべてのグループのテキストも結果のリストの一部として返されます。maxsplit がゼロでなければ、最大 maxsplit 個の分割が発生し、残りはリストの最終要素として返されます。:

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

6.2. re — 正規表現操作 — Python 3.3.6 ドキュメント

\d,\s,\wがそれぞれ数字,空白,英数字に対応.
小文字だとそれらとマッチ,大文字だとそれら以外とマッチする.

04. 元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

解答

import re
l1 = (1,5,6,7,8,9,15,16,19)
g = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
g = re.split('\W+',g)
dic = {}
for i,j in zip(range(len(g)-1),g):
	if i+1 in l1:
		dic.update({i+1:j[0]})
	else:
		dic.update({i+1:j[:2]})
print(dic)

連想配列を作成せよ」なので空配列は仕方ないけれど.
zip()内もうちょっとなんとかできそう?(今度考えてみる.)