我试图从各种字符串中提取一定数量。该号码必须是独立的,在'
之前或(
之前。我想出的正则表达式是:
\b(?<!\()(x)\b(,|\(|'|$)
&lt; - x
是数字。
如果x
为2
,则会拉出以下字符串(几乎),但它也会拉2'abd'
。我在这里做错了什么建议?
2(2'Abf',3),212,2'abc',2(1,2'abd',3)
答案 0 :(得分:0)
根据我的理解,您的实际问题是获取这些特定数字,但括号中的数字除外。
为此,我建议使用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 regex包。