Python-使用RegEx处理字符串

时间:2019-03-01 17:36:46

标签: python regex python-3.x

以下是Active Directory组专有名称。我想从DN的其余部分中分离出最左边的名称,如下所示:

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 =远程桌面用户,CN =内置,DC = ssa,DC = oam,DC = uk,DC = tmo = 远程桌面用户

到目前为止,我所拥有的RegEx只匹配'_'字符串。我的RegEx是:

(?<=CN=)\w*

我还试图弄清楚如何在Python中使用're'模块。目前,我的命令是:

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'>

我想将匹配项作为新字符串获取。

谢谢。

4 个答案:

答案 0 :(得分:2)

似乎您无需正则表达式就可以执行此操作,而只需使用str.split。例如:

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 :(得分:1)

除了提取匹配的字符串外,您的代码几乎全部存在,您需要使用.group()进行访问以进行完全匹配。以下是修改后的代码,

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

按照您的预期打印以下内容,

CTX_APP_Bytemobile_UPM

此外,要捕获空间,还需要使用此正则表达式,

(?<=^CN=)\w+(?:\s+\w+)*
            ^^^^^^^^^^^ This additional part enables it to optionally capture space followed by some word characters

如果您注意到,我将^放在CN=前面,以积极的眼光看待它,因此它与字符串中间的其他CN=仅匹配CN在行首。

Check this demo as well

除了对正则表达式的正面评价外,您还可以使用另一个简单的正则表达式,它比在正则表达式后面落后快近20倍,但使用捕获组。正则表达式后面的([^,]+)部分捕获了您感兴趣的名称。

^[^=]*=([^,]+)

This one is 20 times faster than earlier one

查看此Python代码,

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

打印

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

答案 2 :(得分:1)

尝试:x = re.search("(?<=CN=)[\w\s]*", presplit)

答案 3 :(得分:1)

如果只想等于逗号后的内容,就可以在逗号上分割,请将变量设置为等号加1的位置,并读取到末尾。

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