一つの長い文字列の中に(),[]に括られた部分以外の文字列を順番に抽出したいけれども、ループ文を使って文字毎に判別してやれば自分もできるが、
Pythonらしい一番シンプルな文で実現したいですので、アイディアを求めたいと思います。
例えば、
文字列:"aaabbb[xyze]cccddd(1234)[kjuh]XYZ" から
aaabbb
cccddd
XYZ
だけ順番に抽出したいのです。
どうぞよろしくお願いします。
> アイディアを求めたい
import re
text = "aaabbb[xyze]cccddd(1234)[kjuh]XYZ"
print([*filter(None, re.split(r'\[.*?\]|\(.*?\)', text))])
最もシンプルから遠い答えですが、アイデアだけw
pipでlarkを入れて
from lark import Lark
l = Lark('''
elements: (WORD | NUMBER | block)+
block: "(" elements ")" | "[" elements "]"
start: (elements | block)+
%import common.WORD
%import common.NUMBER
%ignore " "
''')
print(l.parse("aaabbb[xyze]cccddd(1234)[kjuh]XYZ"))
[出力]
Tree(Token('RULE', 'start'), [Tree(Token('RULE', 'elements'), [Token('WORD', 'aaabbb'), Tree(Token('RULE', 'block'), [Tree(Token('RULE', 'elements'), [Token('WORD', 'xyze')])]), Token('WORD', 'cccddd'), Tree(Token('RULE', 'block'), [Tree(Token('RULE', 'elements'), [Token('NUMBER', '1234')])]), Tree(Token('RULE', 'block'), [Tree(Token('RULE', 'elements'), [Token('WORD', 'kjuh')])]), Token('WORD', 'XYZ')])])
※勝手に入れ子の括弧もルールに入れました
🌹🌺 melianさま
これは凄すぎ ❣
さすが 💘💘💘💘
本当にありがとうございます。
ただ、『 re』は何ですか、制御文字列の中の『.*?』はどういう意味でしょうか。
教えていただければ幸いです。
🌹🌺 dameo さま
貴重なアイデアありがとうございます!
文法解析などに利用できそうな技術ですね。
これから勉強したいのです。💘💘💘💘
insecticide さん
>『 re』は何ですか
Python の正規表現(REgular expression)モジュールです。
> 制御文字列の中の『.*?』はどういう意味でしょうか。
最短マッチ、つまり、可能な限り短い文字列でのマッチングを意味するものです。『\[.*?\]』は、"[" 以降、最初の "]" までとなります("[" と "]" を含みます)。『\[.*\]』の場合は最長マッチで、『[xyze]cccddd(1234)[kjuh]』にマッチすることになります。
スマートなやり方で本当に感心しました。
ご説明にお礼を申し上げます。
気持ち悪い。
回答1件
あなたの回答
tips
プレビュー