正则表达式编写思路
- 由于存在嵌套结构,简单的正则表达式难以直接解析。我们可以先将整个文本按大括号划分成不同的块,然后对每个块分别进行解析。
- 对于每一个块,再使用正则表达式来提取具体的键值对信息。
处理边界情况
- 确保正则表达式能够匹配各种可能的字符编码,例如中文、英文和数字的不同编码形式。在Python中,默认的
re
模块在处理Unicode字符时是兼容的。
- 对于嵌套结构,在按大括号划分块时,需要正确处理嵌套的大括号。可以通过维护一个计数器来判断大括号的嵌套层次,确保划分准确。
Python代码实现
import re
def parse_text(text):
pattern = re.compile(r'\{(.*?)\}', re.DOTALL)
blocks = pattern.findall(text)
result = {}
for block in blocks:
sub_pattern = re.compile(r'(\w+?):([^,;]*)')
sub_matches = sub_pattern.findall(block)
for key, value in sub_matches:
if key in result:
if isinstance(result[key], list):
result[key].append(value)
else:
result[key] = [result[key], value]
else:
result[key] = value
return result
text = '用户信息:{姓名:张三,年龄:30,联系方式:[电话:13800138000,邮箱:zhangsan@example.com];用户地址:{省:广东省,市:广州市}}'
print(parse_text(text))
解释
re.compile(r'\{(.*?)\}', re.DOTALL)
:这个正则表达式用于匹配大括号内的内容,re.DOTALL
使得.*?
能够匹配包括换行符在内的所有字符,确保能够匹配嵌套的结构。
re.compile(r'(\w+?):([^,;]*)')
:这个正则表达式用于在每个块内提取键值对,\w+?
匹配键,:
作为分隔符,[^,;]*
匹配值,其中[^,;]
表示除了逗号和分号之外的所有字符。
- 代码中的逻辑会将提取到的键值对存储到字典
result
中,如果遇到重复的键,则将值以列表形式存储。