1
votes

Python - Manipuler la chaîne avec RegEx

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.


1 commentaires

Essayez: x = re.search ("(? <= CN =) [\ w \ s] *", pré-fractionné)


4 Réponses :


1
votes

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.

Vérifiez également cette démo

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


0 commentaires

1
votes

Essayez: x = re.search ("(? <= CN =) [\ w \ s] *", pré-fractionné)


0 commentaires

2
votes

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


1 commentaires

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.



1
votes

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


0 commentaires