MST
星途 面试题库

面试题:Python正则复杂嵌套与否定组合应用

假设你有一个复杂的文本,其中包含类似 'tag1:value1;tag2:value2;...' 这样的结构,'tag' 由字母和数字组成,长度为3 - 5位,'value' 可以是任何字符,但不能包含';'。现在要编写一个Python正则表达式,提取出所有tag为'abc'且value不包含数字的组合。请给出完整的Python代码,详细解释正则表达式中每个部分的作用以及嵌套逻辑。
14.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import re


text = "tag1:value1;abc:no_numbers;tag2:value2;abc:with1number;abc:onlyletters"

pattern = r';abc:([^;]*[^0-9][^;]*)'
matches = re.findall(pattern, text)

for match in matches:
    print(match)


正则表达式解释

  1. ;:匹配文本中的分号,用于分割不同的 tag:value 组合,确保我们从正确的位置开始查找 abc 标签。
  2. abc:直接匹配标签部分为 abc,这是题目要求提取的特定标签。
  3. ::匹配 abc 标签后的冒号,用于分隔标签和值。
  4. ([^;]*[^0-9][^;]*):这是一个捕获组,用于提取值部分。
    • [^;]*:匹配除分号以外的任意字符,0次或多次。这确保了在遇到下一个分号之前,尽可能多的匹配字符。
    • [^0-9]:匹配一个非数字字符,这是为了确保值中至少有一个非数字字符,符合值不包含数字的要求。
    • [^;]*:再匹配一次除分号以外的任意字符,0次或多次。这是为了匹配在非数字字符之后到下一个分号之前的所有字符。

整个正则表达式的逻辑是,先找到分号分隔符,再匹配特定的 abc 标签及后面的冒号,然后通过捕获组提取符合不包含数字要求的值。re.findall 函数用于在文本中查找所有符合该正则表达式模式的内容,并返回捕获组中的值。