MST

星途 面试题库

面试题:Python正则表达式在多语言文本及嵌套结构中的应用

给定一段包含中文、英文及数字,并且存在嵌套结构的文本,如 '用户信息:{姓名:张三,年龄:30,联系方式:[电话:13800138000,邮箱:zhangsan@example.com];用户地址:{省:广东省,市:广州市}}'。使用Python正则表达式来解析出其中所有的结构化信息,包括姓名、年龄、电话、邮箱、省、市等。需要考虑到文本中语言字符的多样性以及嵌套结构可能带来的匹配复杂性,并阐述正则表达式编写思路和如何处理可能出现的边界情况。
14.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

正则表达式编写思路

  1. 由于存在嵌套结构,简单的正则表达式难以直接解析。我们可以先将整个文本按大括号划分成不同的块,然后对每个块分别进行解析。
  2. 对于每一个块,再使用正则表达式来提取具体的键值对信息。

处理边界情况

  1. 确保正则表达式能够匹配各种可能的字符编码,例如中文、英文和数字的不同编码形式。在Python中,默认的re模块在处理Unicode字符时是兼容的。
  2. 对于嵌套结构,在按大括号划分块时,需要正确处理嵌套的大括号。可以通过维护一个计数器来判断大括号的嵌套层次,确保划分准确。

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))

解释

  1. re.compile(r'\{(.*?)\}', re.DOTALL):这个正则表达式用于匹配大括号内的内容,re.DOTALL使得.*?能够匹配包括换行符在内的所有字符,确保能够匹配嵌套的结构。
  2. re.compile(r'(\w+?):([^,;]*)'):这个正则表达式用于在每个块内提取键值对,\w+?匹配键,作为分隔符,[^,;]*匹配值,其中[^,;]表示除了逗号和分号之外的所有字符。
  3. 代码中的逻辑会将提取到的键值对存储到字典result中,如果遇到重复的键,则将值以列表形式存储。