regex - Python 正则表达式负向后查找嵌入式数字
问题描述
我正在尝试从各种字符串中提取某个数字。该数字必须是独立的、之前'
的或之前(
的。我想出的正则表达式是:
\b(?<!\()(x)\b(,|\(|'|$)
<-x
是数字。
如果x
是2
,这将(几乎)拉紧以下字符串,除了它还拉动2'abd'
. 有什么建议我在这里做错了吗?
2(2'Abf',3),212,2'abc',2(1,2'abd',3)
解决方案
据我了解,您的实际问题是,除了括号中的数字外,获取这些特定数字。
为此,我建议使用如下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 正则表达式包。
推荐阅读
- javascript - How to upload a file from Vue frontend to FastAPI backend
- javascript - Tootlip text of svg image is not fetched - Selenium Webdriver
- php - Function to get the embedded content and links from a Wordpress post (from 1 to all of them)
- java - Spring Unit Test Rest Controller 通过设置私有字段
- java - 使用 apache poi 4.1.2 创建工作簿会引发 IndexOutOfBoundsException
- flutter - 如何在 listview Flutter 中使用 showmenu
- javascript - Moment.js,Moment-timezone:在东部时区输入和显示?
- swiftui - 类不符合 Encodable
- python - 在 TensorArray 中为 While_loop 存储可训练值 - tensorflow
- javascript - 显示选定的值