构建正则表达式匹配日志中带可选引号的accountNumber/subNo
正则表达式适配accountNumber/subNo多格式提取需求
针对你需要从日志中提取accountNumber或subNo数值的需求,我们需要覆盖键的引号可选、分隔符多样、值的引号可选三个核心场景,同时兼容JSON和普通语句日志。
原正则的局限性
你之前使用的['"](?:accountNumber|subNo)['"][:-]\s*['"](\d+)['"]只能匹配带引号的键、固定分隔符(:/-)、带引号的数值,无法覆盖无引号键/值、空格作为分隔符的情况,适配范围有限。
修正后的正则表达式
(?:['"])?(accountNumber|subNo)(?:['"])?\s*[:- ]\s*(?:['"])?(\d+)(?:['"])?
正则各部分解析
(?:['"])?:匹配键名前后可选的单引号/双引号,用非捕获组避免生成无用的匹配分组(accountNumber|subNo):匹配目标键名(如果不需要捕获键名,可改成(?:accountNumber|subNo))\s*[:- ]\s*:匹配键后的分隔符,支持:,-, 空格三种类型,前后允许任意空白字符(适配日志中的格式空格)(?:['"])?:匹配数值前后可选的单引号/双引号(\d+):捕获目标数值,这就是你最终需要提取的内容
测试场景覆盖
这个正则可以匹配以下常见日志格式:
JSON格式:
{"accountNumber": "12345", 'subNo': 67890}
普通语句:用户accountNumber- 98765提交了请求
无引号格式:subNo 54321已完成验证
使用示例(以Python为例)
import re log_content = ''' {"accountNumber": "12345", 'subNo': 67890} 用户accountNumber- 98765提交了请求 subNo 54321已完成验证 ''' pattern = r'(?:[\'"])?(accountNumber|subNo)(?:[\'"])?\s*[:- ]\s*(?:[\'"])?(\d+)(?:[\'"])?' results = re.findall(pattern, log_content) # 提取所有数值 values = [val for _, val in results] print(values) # 输出: ['12345', '67890', '98765', '54321']
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

