多规则分割文本的Python正则表达式实现求助
文本分割解决方案
针对你需要处理的350万行格式文本,这里提供两种可行的分割方案,均无需硬编码特定文本:
方案一:纯正则表达式(高效适合大数据量)
通过两次正则匹配分别提取开头的非键值对部分和所有键值对,再按需求拼接结果:
import re def split_text_line(input_line): # 提取开头的非键值对内容(直到第一个 KEY="VALUE" 结构前) start_match = re.match(r'^(.*?)(?=\s+\w+=|$)', input_line) result = [] if start_match: start_part = start_match.group(1).strip() if start_part: result.append(start_part) # 匹配所有 KEY="VALUE" 格式的键值对 kv_pairs = re.findall(r'(\w+)="(.*?)"', input_line) for key, value in kv_pairs: result.append(key) # 仅当值非空时添加,空值则只保留键 if value: result.append(value) return ', '.join(result)
测试示例
- 输入:
EXAMPLE_FILE_TEXT ID="20211111.111111 11111"
输出:
EXAMPLE_FILE_TEXT, ID, 20211111.111111 11111
- 输入:
EXAMPLE_TEXT TAG="AB-123-ABCD_$B" ABCDE_ABCD="ABCD_A" ABCDEF_ABCDE="ABCDEF_ABCDEF_$A" ABCDEFGH=""
输出:
EXAMPLE_TEXT, TAG, AB-123-ABCD_$B, ABCDE_ABCD, ABCD_A, ABCDEF_ABCDE, ABCDEF_ABCDEF_$A, ABCDEFGH
方案二:结合shlex.split与正则(兼容复杂引号场景)
利用shlex.split处理带空格的引号内容,再通过正则拆分键值对:
import shlex import re def split_text_line(input_line): # 用shlex拆分,保留引号内的完整内容 parts = shlex.split(input_line) result = [] for part in parts: # 匹配 KEY="VALUE" 或 KEY=VALUE 格式 kv_match = re.match(r'(\w+)=["]?(.*?)["]?$', part) if kv_match: key = kv_match.group(1) value = kv_match.group(2) result.append(key) if value: result.append(value) else: # 非键值对内容直接添加 result.append(part) return ', '.join(result)
适用场景
如果你的文本中存在转义引号(如KEY="He said \"Hi\""),shlex.split会正确解析引号内的转义内容,比纯正则更可靠。
注意事项
- 若键包含
-等非\w字符,可将正则中的\w+替换为[\w-]+(根据实际键格式调整) - 两种方案均无需硬编码特定键名,可适配所有符合
KEY="VALUE"格式的文本行
内容的提问来源于stack exchange,提问作者Josh41
相关产品推荐
相关产品推荐

