在python中读取文件并向字典添加特定匹配项

在python中读取文件并向字典添加特定匹配项,python,regex,Python,Regex,我想读一个文件为一个特定的匹配在下面的风格“字=字”,特别是我想找到文件与用户名和密码在他们。这些文件将是管理员使用错误做法创建的脚本,在logonscripts等中使用了清晰的凭据 到目前为止,我创建的代码可以完成这项工作,但它非常混乱,如果找到匹配项,就会打印一整行代码(我忍不住认为有一种更优雅的方法可以做到这一点)。这会产生难看的输出,我只想打印行中的匹配项。我似乎找不到一个办法来做那件事。如果我可以为下面的匹配项创建正确的正则表达式,是否可以只打印行中找到的匹配项而不是整行 (我将尝试描

我想读一个文件为一个特定的匹配在下面的风格“字=字”,特别是我想找到文件与用户名和密码在他们。这些文件将是管理员使用错误做法创建的脚本,在logonscripts等中使用了清晰的凭据

到目前为止,我创建的代码可以完成这项工作,但它非常混乱,如果找到匹配项,就会打印一整行代码(我忍不住认为有一种更优雅的方法可以做到这一点)。这会产生难看的输出,我只想打印行中的匹配项。我似乎找不到一个办法来做那件事。如果我可以为下面的匹配项创建正确的正则表达式,是否可以只打印行中找到的匹配项而不是整行

(我将尝试描述我要寻找的匹配类型)

  • *=通配符
  • -=空间
  • ^=空格前的任意字符
匹配

*(U | U)ser^-=-^

测试脚本

strComputer = "atl-ws-01"
strNamespace = “root\cimv2”
strUser = "Administrator"
strPassword = "4rTGh2#1"
user = AnotherUser #Test
pass = AnotherPass #test

Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer _
(strComputer, strNamespace, strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy

Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Wscript.Echo strComputer & ": " & objItem.Caption
Next
接受回复后的最新代码

这是我正在使用的最新代码。它似乎在做预期的工作,除了输出没有管理好以及我喜欢。我想把这些项目添加到字典中。密钥是文件名。还有两个变量,用户名和密码。虽然这将作为一个单独的问题添加

谢谢大家的帮助

dirt = "~/Desktop/tmp"

def get_files():
    regs = ["(.*)((U|u)ser(.*))(\s=\s\W\w+\W)", "(.*)((U|u)ser(.*))(\s=\s\w+)", "(.*)((P|p)ass(.*))\s=\s(\W(.*)\W)", "(.*)((P|p)ass(.*))(\s=\s\W\w+\W)"]
    combined = "(" + ")|(".join(regs) + ")"
    results = dict()
    for root, dirs, files in os.walk(dirt):
    for filename in files:
        if filename.endswith(('.bat', '.vbs', '.ps', '.txt')):
            readfile = open(os.path.join(root, filename), "r")
        for line in readfile:
            m = re.match(combined, line)
            if m:
                print os.path.join(root, filename)
                print m.group(0)
最新代码输出

~/Desktop/tmp/Domain.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strUser = "guytom"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts        /Logon/logonscript1.vbs
strPassword = "P@ssw0rd1"

~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strUsername = "guytom2"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strPass = "SECRETPASSWORD"
~/Desktop/tmp/Domain.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strUser = "guytom"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strPassword = "P@ssw0rd1"

~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strUsername = "guytom2"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strPass = "SECRETPASSWORD"

组([group1,…]) 返回匹配项的一个或多个子组。如果只有一个参数,则结果是一个字符串;如果有多个参数,则结果是一个元组,每个参数有一个项。如果没有参数,group1默认为零(返回整个匹配)。如果groupN参数为零,则相应的返回值为整个匹配字符串

match.group(0)

因为可以有许多object=value,所以需要使用正则表达式。下面是一些示例代码

line1 = " someuser =  bob "
line2 = " bob'spasswd=  secretpassword"
#re.I will do case insensitive search
userMatchObj=re.search('.*user.*=\\s*([\\S]*).*', line1, re.I)
pwdMatchObj=re.search(r'.*pass.*=\s*(.*)', line2, re.I)

if userMatchObj: print "user="+userMatchObj.group(1)
if pwdMatchObj: print "password="+pwdMatchObj.group(1)
输出:

user=bob
password=secretpassword

参考资料:,

谢谢大家的帮助。下面是我的工作代码(需要对输出进行进一步的工作,但匹配工作正常)

最新代码输出

~/Desktop/tmp/Domain.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strUser = "guytom"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts        /Logon/logonscript1.vbs
strPassword = "P@ssw0rd1"

~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strUsername = "guytom2"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strPass = "SECRETPASSWORD"
~/Desktop/tmp/Domain.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strUser = "guytom"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript1.vbs
strPassword = "P@ssw0rd1"

~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strUsername = "guytom2"
~/Desktop/tmp/DLsec.local/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/Scripts/Logon/logonscript2.bat
strPass = "SECRETPASSWORD"

好的,我不知道你刚才说了什么,但是我会围绕比赛小组做一些研究,以及如何使用它们。如果它们像我想的那样工作(在仔细查看文档之后),我可以为模式创建多个组,如
(.*)(U|U)ser(\w+)\s(\=\s)(\w+)
,并返回“找到的”匹配项。(希望我一开始理解正确)当你调用
re.match
时,你会得到一个对象。您可以对该对象调用
group(0)
,它将为您提供匹配的所有文本。“words”和“anycharacter until a space”之间的区别是什么?哈哈哈,它的拼写方式是什么?我将删除单词:P谢谢你指出这一点。你可能只想在“=”上拆分这一行并去掉空格。op=行分区(“=”);(用户,pwd)=(x.strip()代表x in(op[0],op[2]))对不起,但是你刚才说的大部分对我来说并不重要。你能用一个简单的例子给出答案吗?你能给出测试用例和期望的输出吗?这将有助于理解您的问题并更好地概括它。我不认为这会起作用,因为scipt中有很多
object=value
项,而不仅仅是
username=administrator
password=secretpassword
您会将用户名和密码放在同一行吗?也许,这是未知的,但可能。但也会有其他类似的项目。这个(您的代码看起来将拆分所有包含
=
的内容,并打印项目及其值。或者我没有正确解释它吗?我将其更新为使用正则表达式,因为您将有许多对象=值对,并且需要以不敏感的方式查找用户和传递关键字。不过,感谢regex几乎返回了所有的t。)文档中的ext^_^