Python - 理解正则表达式

时间:2018-05-07 18:10:17

标签: python regex subprocess

所以,我从学校的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'

2 个答案:

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