首页 > 解决方案 > Python 正则表达式负向后查找嵌入式数字

问题描述

我正在尝试从各种字符串中提取某个数字。该数字必须是独立的、之前'的或之前(的。我想出的正则表达式是: \b(?<!\()(x)\b(,|\(|'|$)<-x是数字。

如果x2,这将(几乎)拉紧以下字符串,除了它还拉动2'abd'. 有什么建议我在这里做错了吗?

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

标签: regexpython-2.7

解决方案


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

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

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

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

演示

示例代码:

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 正则表达式包。


推荐阅读