正则表达式捕获由表达式分隔的组

时间:2017-03-12 09:26:25

标签: python r regex

如何捕获由[0-9]+分隔的(\], \[)个群组?例如,在

的情况下
[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]

我想捕获三个群组,1 2 3 41 2 41 5 4

1 个答案:

答案 0 :(得分:1)

假设您没有像[[u'1', u'2'], [u'3',u'5']]这样的子模式(同一级别的多个嵌套子组,在这种情况下您需要使用堆栈并像下推自动机一样解析)您可以做这有正则表达式分两步:

(1)用正则表达式\]\s*,\s*\[拆分表达式以获得组,然后根据提供的示例获得3组。

(2)在每个组中使用正则表达式[^0-9u]*u'([0-9]+)'[^0-9u]*来提取数字。

例如,在R中,代码为:

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"

python

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']]

如果需要,您可以将数字映射到整数。