Python-理解正则表达式

Python-理解正则表达式,python,regex,subprocess,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) 这很好,并列出如下用户。。。

所以,我从学校的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个用户名)

我的问题是,我想为这些用户名创建一个“查找”,这是我的代码,用于搜索仅以字母j开头的用户名(因此应该只在此列表中列出jaxe32)

但是当我运行这个程序时,我得到了这个错误,如果我去掉了.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'
回溯(最近一次呼叫最后一次):
文件“getInformation.py”,第11行,在
打印p.match(str(信息)).group()
AttributeError:“非类型”对象没有属性“组”

问题是当
match
方法不匹配任何内容时,它不会返回空的
match
对象,您可以在该对象上调用
方法,它会返回
。它没有
方法。在调用任何方法之前,只需检查
None

#lookup
import re
p = re.compile(r'j(?!j)\w*')
result = p.match(str(information))
if result:
    print result.group()

问题是当
match
方法不匹配任何内容时,它不会返回空的
match
对象,您可以在该对象上调用
方法,它会返回
。它没有
方法。在调用任何方法之前,只需检查
None

#lookup
import re
p = re.compile(r'j(?!j)\w*')
result = p.match(str(information))
if result:
    print result.group()
从以下文件:

如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回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
['jaxe32']
选项2(使用):

输出:

jaxe32
['jaxe32']
从以下文件:

如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回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
['jaxe32']
选项2(使用):

输出:

jaxe32
['jaxe32']

我的意思是说只从一个j开始不是jjI意思是说只从一个j开始不是JJO选项1只为每个以j开始的用户打印出j,但就是这样,所以只得到了一堆j行,但是选项2工作得很完美,谢谢!嗯,选项1对我有用。也许你的数据略有不同。很高兴选项2起作用了!选项1只为每个以j开头的用户打印出j,但仅此而已,所以只得到了一堆j行,但选项2工作得完美无缺,谢谢!嗯,选项1对我有用。也许你的数据略有不同。很高兴选项2起作用了!