如何通过正则按行分组提取特定格式字符串中的内容?
正则按行分组提取特定格式内容
问题背景
我从连接器接收到以下格式的字符串:
{#{123}#};{#{abc}#} {#{345}#};{#{def}#} {#{789}#};{#{ghi}#}
无法修改该格式。目前使用正则表达式 (?s){#{(.*?)}#},得到的结果是 ["123", "abc", "345", "def", "789", "ghi"],希望通过正则实现按行分组的输出,得到 [("123", "abc"), ("345", "def"), ("789", "ghi")]。
正则解决方案
可以通过匹配整行内容并在每行内捕获两个目标字段的方式实现,具体正则表达式如下:
{#{(.*?)}#};{#{(.*?)}#}
正则说明
- 不需要开启
(?s)(单行模式),因为我们要按行匹配,单行模式会让.匹配换行符,反而干扰行级分组 - 每行的结构固定为
{#{X}#};{#{Y}#},直接针对这个结构写正则,第一个捕获组提取X,第二个捕获组提取Y
Python 代码示例
import re raw_str = """{#{123}#};{#{abc}#} {#{345}#};{#{def}#} {#{789}#};{#{ghi}#}""" pattern = r"{#{(.*?)}#};{#{(.*?)}#}" result = re.findall(pattern, raw_str) print(result)
运行结果:
[('123', 'abc'), ('345', 'def'), ('789', 'ghi')]
如果原始字符串里的换行是转义字符 \n,代码依然适用,因为 re.findall 会自动识别换行符分隔的行(只要正则不匹配跨行内容)。
内容的提问来源于stack exchange,提问作者5th
相关产品推荐
相关产品推荐

