challenge 文字列からの情報抽出

与えられた文字列から特定の条件を満たす文字列を抽出するコードを書いてください。 状況としてはテキスト形式で渡された原稿の中から、画像のファイル名を抽出するようなものをイメージしてください。

サンプル入力

aaa abc-hidden.png>hoge-big.jpeg
---foo-hidden-small.gif|^_^a.bmp
--hiddena-hoge.png<=not hidden~~
--small.jpg<=not small(^_^)
normal-small-big.hoge

サンプル出力

name:'abc', ext:'png', size: normal hidden: True
name:'hoge', ext:'jpeg', size: big hidden: False
name:'foo', ext:'gif', size: small hidden: True
name:'a', ext:'bmp', size: normal hidden: False
name:'hoge', ext:'png', size: normal hidden: False
name:'small', ext:'jpg', size: normal hidden: False
name:'small', ext:'hoge', size: big hidden: False

探すべき文字列は下の条件を満たします

  • アルファベットと1個のピリオド、ハイフンで構成される
  • 前後にはアルファベットではない文字がある(abcd.jpgがaaaabcd.jpghogeなどと書かれていることはない)
  • ピリオドの後ろは拡張子で、アルファベットだけで構成されている
  • ピリオドの直前に-hidden, -small, -bigがある場合には特殊な意味がある。複数個ある場合(a-hidden-big.jpgなど)も同じ
  • ファイル名に-hiddenと-smallまたは-hiddenと-bigの両方が含まれる場合は-hiddenの方が先にある
  • 特殊な意味の-hidden, -small, -big以外でハイフンが使われることはない
  • 特殊な意味の-smallと-bigの両方が付くことはない

出力は以下の条件を満たす必要があります

  • ファイル名が出現した順に表示される
  • ファイル名に-hiddenが含まれるかどうかを真偽値で表示する
  • ファイル名に-smallまたは-bigが含まれる場合はsmallまたはbigと、含まれない場合はnormalと表示する
  • -hidden, -small, -bigを取り除いたファイル名部分と、拡張子を表示する

このお題は、正規表現のグループに名前をつけて連想配列として取得できるPythonからの挑戦状です。

Posted feedbacks - Common Lisp


	
1
2
3
4
5
6
7
8
9
(defun print-image-spec (str)
  (ppcre:regex-replace-all "([A-Za-z]+)(-hidden)?(?:-(small|big))?\\.([A-Za-z]+)" str
                           (lambda (m name hidden size ext)
                                   (format t "name:'~a', ext:'~a', size: ~a hidden: ~a~%"
                                           name ext
                                           (if (zerop (length size)) "normal" size)
                                           (if hidden "True" "False"))
                                   m)
                           :simple-calls t))

ごめんなさい。プログラミング初心者です。
初めてcl-ppcre使ってみました。
勉強します。精進します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
(defun frob (str)
  (let ((l (remove-if-not (lambda (s) (cl-ppcre:scan "\\." s)) (cl-ppcre:split "([^A-z-\\.]|_|\\^)" str))))
    (dolist (item l)
      (destructuring-bind (name prop _ ext)
	  (map 'list #'values
	       (nth-value 1 (cl-ppcre:scan-to-strings "[^A-z]*([A-z]*)((-small|-big|-hidden)*)\\.([A-z]*)" item)))
	(declare (ignore _))
	(format t "name: '~A',~,8@Text: '~A', ~,8@Tsize: ~[Small~;Normal~;Big~], ~,8@THidden: ~:[False~;True~]~%" 
		name ext (big-or-small-or-nomal-p prop) (hiddenp prop))))))

(defun hiddenp (str)
  (if (cl-ppcre:scan "-hidden[\\.-]*" str) t nil))

(defun big-or-small-or-nomal-p (str)
  (cond ((cl-ppcre:scan "-big" str) 2) 
	((cl-ppcre:scan "-small" str) 0)
	('T 1)))

Index

Feed

Other

Link

Pathtraq

loading...