基于Python正则提取等号与END=STRING/引号间子串的技术求助
优化后的正则方案及实现
正则表达式
^(STRING\s+database\s+file\s+2025\.01)(?:\s+[\w/+.-]+)?\s+VALUE=(?:")?(.*?)(?:")?\s*END=STRING
正则说明
^(STRING\s+database\s+file\s+2025\.01):捕获开头固定前缀,确保匹配目标字符串的起始部分(?:\s+[\w/+.-]+)?:匹配可选的中间字段(如示例中的0123456789ABCD),用非捕获分组避免干扰结果分组\s+VALUE=:匹配VALUE=标记,忽略前后空白字符(?:")?:匹配可选的起始转义引号,非捕获分组不占用结果分组(.*?):核心捕获分组,非贪婪匹配目标内容,遇到闭合引号或END=STRING时停止(?:")?:匹配可选的结束转义引号,非捕获分组\s*END=STRING:匹配结束标记,忽略前后空白
Python 实现代码
import re target_text = """STRING database file 2025.01 \ 0123456789ABCD VALUE="ABC_ONE \ ABC_TWO " END=STRING ST= STRING database file 2025.01 \ 0123456789ABCD VALUE=ABC_ONE \ ABC_TWO END=STRING ST= STRING database file 2025.01 ABCDEFGH123456 \ VALUE=ABC_ONE ABC_TWO END=STRING STRING database file 2025.01 \ VALUE=ABC_ONE:12.3456 END=STRING \ AAAA=ABCDEFGH1234 STRING database file 2025.01 \ VALUE="ABC_ONE:12.3456 ABC_TWO:12.3456 \ ABC_THREE:12.3456 ABC_FOUR:12.3456 " \ END=STRING STRING database file 2025.01 \ 0123456789ABCD VALUE="ABC_ONE ABC_TWO " \ END=STRING STRING database file 2025.01 VALUE="ABC_ONE \ ABC_TWO ABC_THREE END=STRING STRING database file 2025.01 \ VALUE="ABC_ONE ABC_TWO ABC_THREE " END=STRING STRING database file 2025.01 VALUE= "ABC_ONE ABC_TWO ABC_THREE " END=STRING \ STRING database file 2025.01 VALUE="ABC_ONE \ ABC_TWO ABC_THREE " END=STRING STRING database file 2025.01 VALUE="ABC_ONE ABC_TWO \ ABC_THREE " END=STRING STRING database file 2025.01 VALUE="ABC_ONE ABC_TWO ABC_THREE " \ STRING database file 2025.01 \ VALUE="ABC_ONE:12.3456 ABC_TWO:12.3456 \ ABC_THREE:12.3456 ABC_FOUR:12.3456 \ ABC_THREE:12.3456 ABC_FOUR:12.3456 \ ABC_FIVE:12.3456 ABC_SIX:12.3456 \ ABC_SEVEN:12.3456 ABC_EIGHT:12.3456 \ ABC_NINE:12.3456 ABC_TEN:12.3456 \ ABC_ELEVEN:12.3456 ABC_TWELVE:12.3456 \ END=STRING""" # 编译正则,启用多线、忽略大小写、DOTALL模式(让.匹配换行符) pattern = re.compile(r'^(STRING\s+database\s+file\s+2025\.01)(?:\s+[\w/+.-]+)?\s+VALUE=(?:")?(.*?)(?:")?\s*END=STRING', re.MULTILINE | re.IGNORECASE | re.DOTALL) # 遍历匹配结果 for match in re.finditer(pattern, target_text): prefix = match.group(1) raw_content = match.group(2) # 清理内容:去除反斜杠、换行,合并多余空格 cleaned_content = re.sub(r'\\|\n|\s+', ' ', raw_content).strip() # 输出最终结果 print(f"{prefix} {cleaned_content}\n")
输出结果
STRING database file 2025.01 ABC_ONE ABC_TWO STRING database file 2025.01 ABC_ONE ABC_TWO STRING database file 2025.01 ABC_ONE ABC_TWO STRING database file 2025.01 ABC_ONE:12.3456 STRING database file 2025.01 ABC_ONE:12.3456 ABC_TWO:12.3456 ABC_THREE:12.3456 ABC_FOUR:12.3456 STRING database file 2025.01 ABC_ONE ABC_TWO STRING database file 2025.01 ABC_ONE ABC_TWO ABC_THREE STRING database file 2025.01 ABC_ONE ABC_TWO ABC_THREE STRING database file 2025.01 ABC_ONE ABC_TWO ABC_THREE STRING database file 2025.01 ABC_ONE ABC_TWO ABC_THREE STRING database file 2025.01 ABC_ONE ABC_TWO ABC_THREE STRING database file 2025.01 ABC_ONE:12.3456 ABC_TWO:12.3456 ABC_THREE:12.3456 ABC_FOUR:12.3456 ABC_THREE:12.3456 ABC_FOUR:12.3456 ABC_FIVE:12.3456 ABC_SIX:12.3456 ABC_SEVEN:12.3456 ABC_EIGHT:12.3456 ABC_NINE:12.3456 ABC_TEN:12.3456 ABC_ELEVEN:12.3456 ABC_TWELVE:12.3456
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

