Python - Понимание регулярных выражений - PullRequest
0 голосов
/ 07 мая 2018

Итак, я беру список имен пользователей с сервера 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 голосов
/ 07 мая 2018

Из документации на 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']
0 голосов
/ 07 мая 2018

Проблема в том, что когда метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...