所以,我从学校的Linux服务器上获取了一个用户名列表,这个顶级代码打开了保存它们的目录并将其保存为信息
#!/usr/bin/env python
import subprocess, sys
r = subprocess.Popen(['ls','/home/ADILSTU'], stdout=subprocess.PIPE)
information = r.stdout.read()
print information, str(information)
工作得很好并列出这样的用户...每行列出1个。 (至少有100个用户名)
ajax2
jjape3
jaxe32
我的问题是,我想为这些用户名创建一个“查找”,这是我的代码,用于搜索仅以字母j开头的用户名(所以应该只列出此列表中的jaxe32)
#lookup
import re
p = re.compile(r'j(?!j)\w*')
print p.match(str(information)).group()
但是当我运行这个时,我得到了这个错误,如果我摆脱了.group()它然后只是声明“无”,但没有错误。所以我不确定列表是否正确保存到字符串,或者我是否只是遗漏了一些明显的东西。我只想为此使用正则表达式,而不是其他任何东西。
Traceback (most recent call last):
File "getInformation.py", line 11, in <module>
print p.match(str(information)).group()
AttributeError: 'NoneType' object has no attribute 'group'
答案 0 :(得分:2)
来自re.match
的文档:
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回None;
re.match
仅在匹配从字符串的开头开始时才有用,它不会在字符串中找到所有匹配项。
这为您提供了两个主要选项:
逐行拆分输入文件并使用re.match
使用多行匹配和re.findall
选项1 :
r = subprocess.Popen(['ls', '/home/administrator/sotest'], stdout=subprocess.PIPE)
information = r.stdout.read().decode('utf-8').split('\n') # ['ajax2', 'jaxe32', 'jjape3', '']
for user in information:
s = re.match(r'j(?!j)\w*', user)
if s:
print(s.group())
输出:
jaxe32
选项2 (使用(?m)^j(?!j)\w*$
):
r = subprocess.Popen(['ls', '/home/administrator/sotest'], stdout=subprocess.PIPE)
information = r.stdout.read().decode('utf-8') # 'ajax2\njaxe32\njjape3\n'
print(re.findall(r'(?m)^j(?!j)\w*$', information))
输出:
['jaxe32']
答案 1 :(得分:1)
问题是当match
方法没有匹配时,它不会返回一个空的match
对象,您可以在其上调用group
方法,它返回None
。哪个没有group
方法。在调用任何方法之前,只需检查None
。
#lookup
import re
p = re.compile(r'j(?!j)\w*')
result = p.match(str(information))
if result:
print result.group()