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
相关产品推荐
相关产品推荐

