You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 提取字符串中CN=开头子串的更简洁高效实现方法

LDAP DN字符串提取CN字段的精简方案

需求

现有多组LDAP DN组成的长字符串,DN之间用分号分隔,需要提取所有DN中以CN=开头的字段值,截止到CN字段后的第一个逗号即可。
输出示例如下:
输出示例图

原有实现(冗长版)

import re
import fnmatch
import os

# System call
os.system("")

# Class of different styles
class style():
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'

CNString = "CN=User2,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User4,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User56,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User9,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Jane45 user,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User-Donna,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User76 smith,OU=blurb,OU=Test4,DC=Test,DC=Testal;CN=Pink Panther,OU=blurb,OU=Test,DC=Testing,DC=Testal;CN=Testuser78,OU=blurb,OU=Tester,DC=Test,DC=Testal;CN=great Scott,OU=blurb,OU=Test,DC=Test,DC=Local;CN=Leah Human,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Alan Desai,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Duff Beer,OU=Groups,OU=Test,DC=Test,DC=Testal;CN=Jane Doe,OU=Users,OU=Test76,DC=Test,DC=Testal;CN=simple user67,OU=Users,OU=Test,DC=Test,DC=Testal;CN=test O'Lord,OU=Users,OU=Test,DC=Concero,DC=Testal"

newstring1 = CNString.replace(';','];')
print(newstring1)

newstring2 = newstring1.replace(',OU=',',[OU=')
print(newstring2)

newstring3 = newstring2.replace(',[OU','],[OU')
print(newstring3)

newstring4 = newstring3.replace('],[OU',',[OU')
print(newstring4)

newstring5 = newstring4.replace('];',']];')
print(newstring5)

endstring = "]]"
newstring6 = newstring5 + endstring
print(newstring6)

newstring7 = re.sub("\[.*?\]","()",newstring6)
print(newstring7)

print(style.YELLOW + "Line Break")

newstring8 = newstring7.replace(',()]','')
print(style.RESET + newstring8)

newstring9 = newstring8.split(';')
for cnname in newstring9:
    print(style.GREEN + cnname)

精简实现(推荐版)

import re
import os

os.system("")

class style():
    GREEN = '\033[32m'
    RESET = '\033[0m'

CNString = "CN=User2,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User4,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User56,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User9,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Jane45 user,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User-Donna,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=User76 smith,OU=blurb,OU=Test4,DC=Test,DC=Testal;CN=Pink Panther,OU=blurb,OU=Test,DC=Testing,DC=Testal;CN=Testuser78,OU=blurb,OU=Tester,DC=Test,DC=Testal;CN=great Scott,OU=blurb,OU=Test,DC=Test,DC=Local;CN=Leah Human,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Alan Desai,OU=blurb,OU=Test,DC=Test,DC=Testal;CN=Duff Beer,OU=Groups,OU=Test,DC=Test,DC=Testal;CN=Jane Doe,OU=Users,OU=Test76,DC=Test,DC=Testal;CN=simple user67,OU=Users,OU=Test,DC=Test,DC=Testal;CN=test O'Lord,OU=Users,OU=Test,DC=Concero,DC=Testal"

# 核心提取逻辑,一行完成匹配
cn_list = re.findall(r'CN=[^,]*', CNString)

for cn in cn_list:
    print(style.GREEN + cn + style.RESET)

方案说明

  • 去掉了原代码中无用的fnmatch依赖,style类仅保留用到的两个颜色属性
  • 核心匹配逻辑通过正则全局匹配实现:r'CN=[^,]*'表示匹配所有以CN=开头,后续所有非逗号的字符,刚好匹配每个DN中的CN字段,完全符合需求
  • 无冗余的多次字符串替换操作,代码逻辑简洁,可读性和可维护性大幅提升
  • 输出结果与原实现完全一致

内容的提问来源于stack exchange,提问作者NeoTheNerd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:04