2011-01-11 4 views
0

Я пытаюсь создать регулярное выражение (import re), чтобы извлечь информацию, которую я хочу из файла журнала.Regex для проверки нескольких строк

ОБНОВЛЕНИЕ: Добавлены права доступа к папке C:\WINDOWS\security, которые разбили все коды образцов.

Say формат журнала является:

C:\: 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Folders 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Files 
    \Everyone Allowed: Read & Execute 
    (No auditing) 

C:\WINDOWS\system32: 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Power Users Allowed: Modify 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Delete 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    (No auditing) 

C:\WINDOWS\system32\config: 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Power Users Allowed: Read & Execute 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    (No auditing) 

C:\WINDOWS\security: 
    BUILTIN\Users Allowed: Special Permissions: 
      Traverse Folder 
      Read Attributes 
      Read Permissions 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Traverse Folder 
      Read Attributes 
      Read Permissions 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    (No auditing) 

И это повторяется несколько других каталогов. Как я могу разбить их на paragraphs, а затем проверить строки, содержащие Special Permissions:?

Как это:

  1. Раздельное весь string1 в несколько частей, C:\ и C:\WINDOWS\system32.
  2. Посмотрите в каждой строке, которая содержит 'специальные разрешения:'
  3. Показать все строки, например: C:\: BUILTIN\Users Allowed: Special Permissions: \n\ Create Folders\n\ BUILTIN\Users Allowed: Special Permissions: \n\ Create Files\n\
  4. Повторите эти действия для следующего 'пункта'

I думал о: 1. Искать весь текстовый файл для r"(\w+:\\)(\w+\\?)*:" - верните мне путь 2. Функция Строка или регулярное выражение, чтобы получить остальную часть выходного 3. Удалить все другие строки, кроме тех, с Special Permissions 4. Дисплей и повторите шаг 1

Но я думаю, что это не эффективно.

Может ли кто-нибудь навестить меня на этом? Благодарю.


Пример вывода:

C:\: 
BUILTIN\Users Allowed: Special Permissions: 
Create Folders 
BUILTIN\Users Allowed: Special Permissions: 
Create Files 

C:\WINDOWS\system32: 
BUILTIN\Power Users Allowed: Special Permissions: 
Delete 

C:\WINDOWS\security: 
BUILTIN\Users Allowed: Special Permissions: 
Traverse Folder 
Read Attributes 
Read Permissions 
BUILTIN\Power Users Allowed: Special Permissions: 
Traverse Folder 
Read Attributes 
Read Permissions 

C:\WINDOWS\system32\config не показывает, как нет специального разрешения в линиях.


Шаблон я использую:

import re 

text = "" 

def main(): 
    f = open('DirectoryPermissions.xls', 'r') 
    global text 
    for line in f: 
     text = text + line 
    f.close 
    print text 

def regex(): 
    global text 
    <insert code here> 

if __name__ == '__main__': 
    main() 
    regex() 

+0

Используйте 're' модуль, а не' regex'. Кроме того, просмотрите строки с тремя кавычками. – nmichaels

+3

Какие данные вы хотите в конце? – MattH

+0

@nmichaels, Lol Я отредактировал, я использую 'import re' @MattH - Чтобы показать полную строку (строки), содержащую' Специальные разрешения: 'в каждом пути –

ответ

0

Благодаря milkypostman, scoffey , а остальное я придумал решение:

def regex(): 
    global text 
    for paragraph in text.split('\n\n'): 
     lines = paragraph.split('\n', 1) 
     #personal modifier to choose certain output only 
     if lines[0].startswith('C:\\:') or lines[0].startswith('C:\\WINDOWS\system32:') or lines[0].startswith('C:\\WINDOWS\\security:'): 
      print lines[0] 
      iterables = re.finditer(r".*Special Permissions: \n(\s+[a-zA-Z ]+\n)*", lines[1]) 
      for items in iterables: 
       #cosmetic fix 
       parsedText = re.sub(r"\n$", "", items.group(0)) 
       parsedText = re.sub(r"^\s+", "", parsedText) 
       parsedText = re.sub(r"\n\s+", "\n", parsedText) 
       print parsedText 
      print 

Я все равно просмотрю все опубликованные коды (особенно. scoffey, так как я никогда не знал, что чистые манипуляции с строками - это мощные). Спасибо за понимание!

Конечно, это не самый оптимальный вариант, но это работает для моего случая. Если у вас есть предложения, не стесняйтесь публиковать сообщения.


Выход:

C:\Python27>openfile.py 
C:\: 
BUILTIN\Users Allowed:  Special Permissions: 
Create Folders 
BUILTIN\Users Allowed:  Special Permissions: 
Create Files 

C:\WINDOWS\security: 
BUILTIN\Users Allowed:  Special Permissions: 
Traverse Folder 
Read Attributes 
Read Permissions 
BUILTIN\Power Users  Allowed:  Special Permissions: 
Traverse Folder 
Read Attributes 
Read Permissions 

C:\WINDOWS\system32: 
BUILTIN\Power Users  Allowed:  Special Permissions: 
Delete 
2
# I would replace this with reading lines from a file, 
# rather than splitting a big string containing the file. 

section = None 
inspecialperm = False 
with open("testdata.txt") as w: 
    for line in w: 
     if not line.startswith("   "): 
      inspecialperm = False 

     if section is None: 
      section = line 

     elif len(line) == 0: 
      section = None 

     elif 'Special Permissions' in line: 
      if section: 
       print section 
       section = "" 
      inspecialperm = True 
      print line, 

     elif inspecialperm: 
      print line, 
+0

Привет, спасибо, проверим это сейчас. =) –

+0

Я пробовал ваш код, он работает частично, правильно выбирая специальные разрешения, но не печатает сами разрешения. Я постараюсь поиграть с ним. –

+0

Я немного обновил его. Теперь он не печатает заголовки разделов, если у них нет строки «Специальные разрешения», и она должна печатать разрешения. Если вы не хотите, чтобы распечатываемые вкладки были напечатаны, просто сделайте над ними полоску перед печатью. – milkypostman

1

Вам не нужно re модуль на всех, если вы разбора строк с помощью "разделить & полосу", которая является более эффективны:

for paragraph in string1.split('\n\n'): 
    path = paragraph.split('\n', 1)[0].strip().rstrip(':') 
    paragraph = paragraph.replace(': \n', ': ') # hack to have permissions in same line 
    for line in paragraph.split('\n'): 
     if 'Special Permissions: ' in line: 
      permission = line.rsplit(':', 1)[-1].strip() 
      print 'Path "%s" has special permission "%s"' % (path, permission) 

Заменить заявление print с любыми вашими потребностями.

EDIT: Как было отмечено в комментарии, предыдущее решение не работает с новыми входными линиями в отредактированной вопрос, но вот как это исправить (еще более эффективно, чем с помощью регулярных выражений):

for paragraph in string1.split('\n\n'): 
    path = paragraph.split('\n', 1)[0].strip().rstrip(':') 
    owner = None 
    for line in paragraph.split('\n'): 
     if owner is not None and ':' not in line: 
      permission = line.rsplit(':', 1)[-1].strip() 
      print 'Owner "%s" has special permission "%s" on path "%s"' % (owner, permission, path) 
     else: 
      owner = line.split(' Allowed:', 1)[0].strip() if line.endswith('Special Permissions: ') else None 
+0

Привет, спасибо, проверим это сейчас. =) –

+0

Ваш код как-то ломается при предъявлении: C: \ WINDOWS \ Безопасность: \t BUILTIN \ Users \t разрешены: \t Особые разрешения: \t \t \t Traverse Folder \t \t \t Чтение атрибутов \t \t \t Чтение разрешений –

+0

Правда , Он предназначен для анализа исходной строки ввода перед редактированием вопроса. Теперь я обновил решение, чтобы соответствовать последнему делу. – scoffey

0

Вот решение с использованием модуля re и метода findall.

data = '''\ 
C:\: 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Folders 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Files 
    \Everyone Allowed: Read & Execute 
    (No auditing) 

C:\WINDOWS\system32: 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Power Users Allowed: Modify 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Delete 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    (No auditing) 

C:\WINDOWS\system32\config: 
    BUILTIN\Users Allowed: Read & Execute 
    BUILTIN\Power Users Allowed: Read & Execute 
    BUILTIN\Administrators Allowed: Full Control 
    NT AUTHORITY\SYSTEM Allowed: Full Control 
    (No auditing) 
''' 

if __name__ == '__main__': 
    import re 

    # A regular expression to match a section "C:...." 
    cre_par = re.compile(r''' 
       ^C:.*? 
       ^\s*$''', re.DOTALL | re.MULTILINE | re.VERBOSE) 

    # A regular expression to match a "Special Permissions" line, and the 
    # following line. 
    cre_permissions = re.compile(r'''(^.*Special\ Permissions:\s*\n.*)\n''', 
           re.MULTILINE | re.VERBOSE) 

    # Create list of strings to output. 
    out = [] 
    for t in cre_par.findall(data): 
     out += [t[:t.find('\n')]] + cre_permissions.findall(data) + [''] 

    # Join output list of strings together using end-of-line character 
    print '\n'.join(out) 

Вот генерируемый вывод:

C:\: 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Folders 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Files 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Delete 

C:\WINDOWS\system32: 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Folders 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Files 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Delete 

C:\WINDOWS\system32\config: 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Folders 
    BUILTIN\Users Allowed: Special Permissions: 
      Create Files 
    BUILTIN\Power Users Allowed: Special Permissions: 
      Delete 
+0

Привет, спасибо за код, но результат неправильный. 'system32 \ config' не должен появляться, и есть только' Специальные разрешения: Удалить' для 'system32'. 'C: \:' должен иметь только 'Create Files and Folders'. Тем не менее, я тоже рассмотрю ваш код. Еще раз спасибо –

1

Аналогично решению milkypostman, но в формате, который вы пытаетесь иметь, что выход в:

lines=string1.splitlines() 
seperator = None 
for index, line in enumerate(lines): 
    if line == "": 
     seperator = line 
    elif "Special Permissions" in line: 
     if seperator != None: 
      print seperator 
     print line.lstrip() 
     offset=0 
     while True: 
      #if the line's last 2 characters are ": " 
      if lines[index+offset][-2:]==": ": 
       print lines[index+offset+1].lstrip() 
       offset+=1 
      else: 
       break 
+0

Привет, я пробовал этот код, но я не могу заставить его работать, он продолжает печатать «Создать папки», и мне приходится вручную его завершать. Что пошло не так? –

+0

Моя ошибка. Сожалею. Исправлено. –

+0

Ничего себе, ваша логика кодируется по-другому по сравнению с другими. Во всяком случае, с удовольствием попробуйте, если вы получите правильные разрешения, но не распечатаете их соответствующие каталоги. –

Смежные вопросы