文字列からの情報抽出
Posted feedbacks - Python
すみません、名前を付けた正規表現を知らないので、とりあえず普通の正規表現で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import re
def extract(s):
for m in re.finditer('([a-zA-Z]+)(-hidden)?(?:-(big|small))?\.([a-zA-Z]+)', s):
print "name:%r, ext:%r, size: %s hidden: %r" % \
(m.group(1), m.group(4), m.group(3) or "normal", bool(m.group(2)))
def main():
extract("""\
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""")
if __name__ == '__main__':
main()
|
名前つき正規表現なら、大体こんな感じになると思いますが、 このお題の「-hidden」の処理のように、なんらかの操作が 必要な場合は、ありがたみが少々落ちますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import re
dat = '''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
'''
ptn = '(?P<name>[a-zA-Z]+)(-hidden)?(?:-(?P<size>big|small))?\.(?P<ext>[a-zA-Z]+)'
fmt = "name:'%(name)s', ext:'%(ext)s', size: %(size)s, hidden: %%s"
for g in re.finditer(ptn, dat):
print fmt % g.groupdict('normal') % bool(g.group(2))
|
それは%の文字列フォーマット操作で全部やってしまおうとせずに 素直にif文を使う方が後々読みやすくていいと思います。
1 2 3 4 5 6 7 8 | ptn = '(?P<name>[a-zA-Z]+)(?P<hidden>-hidden)?(?:-(?P<size>big|small))?\.(?P<ext>[a-zA-Z]+)'
fmt = "name:'%(name)s', ext:'%(ext)s', size: %(size)s, hidden: %(hidden)s"
for g in re.finditer(ptn, dat):
params = g.groupdict()
params["hidden"] = (params["hidden"] == "-hidden")
if not params["size"]: params["size"] = "normal"
print fmt % params
|




にしお
#3407()
Rating0/0=0.00
サンプル入力
サンプル出力
探すべき文字列は下の条件を満たします
出力は以下の条件を満たす必要があります
このお題は、正規表現のグループに名前をつけて連想配列として取得できるPythonからの挑戦状です。
[ reply ]