Les noms distinctifs du groupe Active Directory sont les suivants. Je veux séparer le nom le plus à gauche du reste du DN, comme suit:
CN = CTX_APP_Bytemobile_UPM, OU = EEGroups, OU = EEOU, DC = ssa, DC = oam, DC = uk, DC = tmo = CTX_APP_Bytemobile_UPM
CN = OSGRP_IP_Transport, OU = EEGroups, OU = EEOU, DC = ssa, DC = oam, DC = uk, DC = tmo = OSGRP_IP_Transport
CN = Utilisateurs du Bureau à distance, CN = Intégré, DC = ssa, DC = oam, DC = uk, DC = tmo = Utilisateurs du Bureau à distance
Jusqu'à présent, le RegEx que j'ai correspond uniquement aux chaînes '_'. Mon RegEx est:
presplit = "CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo"
x = re.search("(?<=CN=)\w*", presplit)
print(x) >>> *returns* <re.Match object; span=(3,15), match='CTX_APP_Bytemobile'>
J'essaie également de comprendre comment utiliser le module 're' en Python. Actuellement, ma commande est:
(?<=CN=)\w*
Je souhaite obtenir la correspondance sous forme de nouvelle chaîne.
Merci d'avance.
4 Réponses :
Votre code est presque là, sauf pour l'extraction de la chaîne correspondante, vous devez y accéder en utilisant .group () pour une correspondance complète. Voici votre code modifié,
CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo = CTX_APP_Bytemobile_UPM --> CTX_APP_Bytemobile_UPM CN=OSGRP_IP_Transport,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo = OSGRP_IP_Transport --> OSGRP_IP_Transport CN=Remote Desktop Users,CN=Builtin,DC=ssa,DC=oam,DC=uk,DC=tmo --> Remote Desktop Users
Les impressions suivantes comme vous vous y attendiez,
import re arr=['CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo = CTX_APP_Bytemobile_UPM','CN=OSGRP_IP_Transport,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo = OSGRP_IP_Transport','CN=Remote Desktop Users,CN=Builtin,DC=ssa,DC=oam,DC=uk,DC=tmo'] for s in arr: m = re.search(r'^[^=]*=([^,]+)', s) if (m): print(s,'-->',m.group(1))
De plus, pour capturer des espaces également, vous devez utilisez cette expression régulière,
^[^=]*=([^,]+)
Si vous remarquez, j'ai placé un ^ avant CN = en regard positif derrière donc il ne correspond pas aux autres CN = au milieu de la chaîne et juste CN au début de la ligne.
En plus de votre regard positif sur les regex peut utiliser une autre regex simple, qui est presque 20 fois plus rapide que de regarder derrière une mais utilise un groupe de capture. Cette partie ([^,] +) de l'expression régulière suivante capture le nom qui vous intéresse.
(?<=^CN=)\w+(?:\s+\w+)*
^^^^^^^^^^^ This additional part enables it to optionally capture space followed by some word characters
Celui-ci est 20 fois plus rapide que le précédent
Découvrez ce Python code,
CTX_APP_Bytemobile_UPM
Imprime,
import re
presplit = "CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo"
x = re.search("(?<=^CN=)\w+(?:\s+\w+)*", presplit)
if(x):
print(x.group())
Essayez: x = re.search ("(? <= CN =) [\ w \ s] *", pré-fractionné)
On dirait que vous pourriez faire cela sans regex et utiliser simplement str.split à la place. Par exemple:
s = 'CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo'
result = s.split(',')[0].split('=')[1]
print(result)
# CTX_APP_Bytemobile_UPM
Certaines personnes, confrontées à un problème, pensent: "Je sais, je vais utiliser des expressions régulières". Maintenant, ils ont deux problèmes. C'est un excellent exemple.
Si vous voulez juste ce qui se trouve après l'équivalent de la virgule, vous pouvez simplement diviser par la virgule, définir une variable à la position du signe égal plus un et la lire jusqu'à la fin.
presplit = "CN=CTX_APP_Bytemobile_UPM,OU=EEGroups,OU=EEOU,DC=ssa,DC=oam,DC=uk,DC=tmo"
#Make a list of strings split on the comma
lst = presplit.split(",")
#Iterate through the list
for i in lst:
#Set the starting position to where the equal sign is plus one
strt = re.search("=", i).start()+1
#Get the string from the character after the equal sign to the end of the string
print(i[strt:])
Essayez:
x = re.search ("(? <= CN =) [\ w \ s] *", pré-fractionné)