1
キャプチャ方法グループは、(\], \[)
で区切られますか?例えば、式で区切られたグループをキャプチャするための正規表現
[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]
の場合、私は三つのグループ、1 2 3 4
、1 2 4
と1 5 4
をキャプチャしたいと思います。
キャプチャ方法グループは、(\], \[)
で区切られますか?例えば、式で区切られたグループをキャプチャするための正規表現
[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]
の場合、私は三つのグループ、1 2 3 4
、1 2 4
と1 5 4
をキャプチャしたいと思います。
[[u'1', u'2'], [u'3',u'5']]
のようなサブパターン(同じレベルに複数のネストされたサブグループがあります。この場合、スタックを使用し、プッシュダウンオートマトンのように解析する必要があります)では、次の正規表現でこれを行うことができます。 2つのステップ:
(1)式を正規表現\]\s*,\s*\[
で分割して最初にグループを取得すると、提供されている例に対して3つのグループが得られます。
(2)各グループ内では、正規表現[^0-9u]*u'([0-9]+)'[^0-9u]*
を使用して数字を抽出します。例えば
は、R
で、コードは次のようになります。
python
で
str <- "[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]"
groups <- unlist(strsplit(str, split='\\]\\s*,\\s*\\['))
pattern <- "[^0-9u]*u'([0-9]+)'[^0-9u]*"
lapply(groups, function(str) gsub(pattern, "\\1", regmatches(str,gregexpr(pattern,str))[[1]]))
#[[1]]
#[1] "1" "2" "3" "4"
#[[2]]
#[1] "1" "2" "4"
#[[3]]
#[1] "1" "5" "4"
:
import re
str = "[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]"
groups = re.split('\]\s*,\s*\[', str)
pattern = "[^0-9u]*u'([0-9]+)'[^0-9u]*"
print map(lambda x: re.findall(pattern, x), groups)
# [['1', '2', '3', '4'], ['1', '2', '4'], ['1', '5', '4']]
必要な場合は、整数に数字をマッピングできます。
正規表現ではなく、パーサーを使用する必要があります。正規表現は入れ子構造をうまく扱えません。 –
ありがとう、@TimBiegeleisen!私は長い時間をかけてリストを平坦化しようとしていましたが、すべてを解決する魔法の正規表現を見つけることを望みましたが、私の目を開いてPython – Adam