Python正则表达式负向lookbehind嵌入数字数字

时间:2018-05-27 23:46:08

标签: regex python-2.7

我试图从各种字符串中提取一定数量。该号码必须是独立的,在'之前或(之前。我想出的正则表达式是: \b(?<!\()(x)\b(,|\(|'|$)&lt; - x是数字。

如果x2,则会拉出以下字符串(几乎),但它也会拉2'abd'。我在这里做错了什么建议?

2(2'Abf',3),212,2'abc',2(1,2'abd',3)

1 个答案:

答案 0 :(得分:0)

根据我的理解,您的实际问题是获取这些特定数字,但括号中的数字除外。

为此,我建议使用skip_what_to_avoid|what_i_want模式,如下所示:

(\((?>[^()\\]++|\\.|(?1))*+\))
|\b(2)(?=\b(?:,|\(|'|$))

这里的想法是完全忽略整体匹配(并且首先使用递归模式来捕获括号之间的所有内容:(\((?>[^()\\]++|\\.|(?1))*+\))):这就是垃圾桶。相反,我们只需要检查捕获组$ 2,它在设置时包含注释之外的星号。

Demo

示例代码:

import regex as re

regex = r"(\((?>[^()\\]++|\\.|(?1))*+\))|\b(2)(?=\b(?:,|\(|'|$))"
test_str = "2(2'Abf',3),212,2'abc',2(1,2'abd',3)"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1
    if match.groups()[1] is not None:
        print ("Found at {start}-{end}: {group}".format(start = match.start(2), end = match.end(2), group = match.group(2)))

输出:

Found at 0-1: 2
Found at 16-17: 2
Found at 23-24: 2

此解决方案需要替代Python regex包。