regex - 正则表达式在字符后获取特定模式
问题描述
输入字符串:
-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[14][MY_SAMPLE_TEST]
-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[4][MY_SAMPLE_TEST2]
-line[8qWWQ5-swd-WER-DWDS]]<Failed#[17][[14]SERVERERROR(TYPE-241)
预期输出:
MY_SAMPLE_TEST
MY_SAMPLE_TEST2
SERVERERROR
我的正则表达式: (?<=#).*
上面的正则表达式我可以得到 # 之后的所有内容,我也尝试过:
rex = (?<=#\[...\[).*(?=])
这给了我第一行的正确输出,即:MY_SAMPLE_TEST,但由于第二行只有一个数字,即 4,所以它不匹配,与第三行类似的问题
是否可以编写一个可以给出预期输出的表达式?, 任何帮助都会很棒
解决方案
您可以使用以下方法捕获这些值
#(?:\[+\d+]+)*\[*([^][()]+)
查看正则表达式演示
细节
#
- 一个井号(?:\[+\d+]+)*
- 0次或多次重复:\[+
- 1+[
个字符\d+
- 1+ 位数]+
- 1+]
个字符
\[*
- 0+ 个[
字符([^][()]+)
(
- 第 1 组:除、和)
之外的一个或多个字符[
]
import re
strs = ['-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[14][MY_SAMPLE_TEST]', '-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[4][MY_SAMPLE_TEST2]', '-line[8qWWQ5-swd-WER-DWDS]]<Failed#[17][[14]SERVERERROR(TYPE-241)']
rx = re.compile(r'#(?:\[+\d+]+)*\[*([^][()]+)')
for s in strs:
m = rx.search(s)
if m:
print(m.group(1))
输出:
MY_SAMPLE_TEST
MY_SAMPLE_TEST2
SERVERERROR
推荐阅读
- symfony - Symfony:查询生成器:可捕获的致命错误:DateTime 类的对象无法转换为字符串
- php - 如何使用 HTML 复选框值来确定要转到哪个 php 页面?
- javascript - Webpack:由于 publicPath 导致 /src 和 /dist 文件出现问题
- javascript - javascript数组转换为特定格式
- django - 在序列化器中表示一对一关系的另一端
- java - Android - 关闭特定的蓝牙套接字
- rust - lazy_static 引发错误,因为“没有规则需要令牌”
- php - PHP、MYSQL 工作台、邮递员无法正常工作
- c++ - 为什么这个参考集不允许?
- python - ctypes-defined PROCESSENTRY32 在使用 ctypes.sizeof 时会产生不正确的大小