【问题标题】:Python - Understanding Regular ExpressionPython - 理解正则表达式
【发布时间】:2018-10-17 14:37:46
【问题描述】:

所以,我从学校的 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() ,它只会声明“none”,但没有错误。所以我不确定列表是否正确保存到字符串中,或​​者我是否只是遗漏了一些明显的东西。我只想为此使用正则表达式,而不是其他任何东西。

    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'

【问题讨论】:

  • 我的意思是说只有一个j而不是jj

标签: python regex subprocess


【解决方案1】:

来自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 只为每个以 j 开头的用户打印 j,但仅此而已,所以只得到了一堆 j 行,但选项 2 完美运行,谢谢!
  • 嗯,选项 1 对我有用。也许您的数据略有不同。很高兴选项 2 有效!
【解决方案2】:

问题在于,当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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2010-10-23
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多