2015-07-17 3 views
0

мне нужно разобрать текстовый файл, который содержит имена и идентификатор пользователейКак разобрать этот текстовый файл с регулярным выражением, в Python?

+----+---------------+---------------+ 
| Id | Login   | Name   | 
+----+---------------+---------------+ 
| 1 | admin   | admin   | 
| 2 | admin2  | admin2  | 
| 3 | ekaterina  | Ekaterina  | 
| 4 | commarik  | commarik  | 
| 5 | basildrescher | BasilDrescher | 
| 6 | danielalynn | DanielaLynn | 
| 7 | rosez13yipfj | RoseZ13yipfj | 
| 8 | veolanoyes | VeolaNoyes | 
| 9 | angel   | Angel   | 
| 10 | michalea44 | MichaleA44 | 
+----+---------------+---------------+ 

Поэтому я использую re, как это:

import re 
fh = open('test1.txt') 
lines = fh.readlines() 
for line in lines: 
     #print line 
     p = re.compile(r"|(.*?)|") 
     m2 = p.search(line) 
     if m2: 
       print m2.group(0) 

Проблема заключается в том, что я не могу получить нужный результат! Я пробовал различные комбинации с пробелами и вкладками, но это не сработало. Я решил это с split(), но я все еще хочу понять, где я ошибаюсь. Любая помощь будет оценена по достоинству. Спасибо!

+1

' р = re.compile (...) 'может быть вне' для 'loop. – galath

+1

В качестве альтернативы рассмотрим' m2 = line.strip ('|').split ('|') ' –

+0

Код должен анализировать журналы wpscan в удобной форме для пользователей. –

ответ

3

| - специальный символ в регулярных выражениях для выражения «или» с двумя выражениями. Вам нужно избежать этого, как \|, чтобы соответствовать фактическому персонажу. Кроме того, search() найдет одно совпадение. Вы можете посмотреть другие методы, такие как findall.

+0

Спасибо, что сделали работу! –

4

У вас есть несколько ошибок:

  • | не ускользнули
  • У вас есть только одна группа, поэтому вы извлекаете только первый столбец.

Регулярное выражение должно быть так:

\|(.*?)\|(.*?)\|(.*?)\| 

Вы можете посмотреть демо here.

+0

Это полностью проблема, спасибо! –

1

Попробуйте использовать это регулярное выражение, чтобы захватить каждую отдельную строку в качестве отдельной группы захвата, в соответствии с синтаксисом:

\|\s*([0-9]+)\s*\|\s*([\w]+)\s*\|\s*([\w]+)\s*\| 

Или используйте этот захватить так же, как вы пытаетесь выше (который также получит заголовки):

\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\| 

Вот demo из первых.

Как уже сказали еще два человека, вы не избежали символа вашей трубы, который был испорчен.

Кроме того, вы не принимали во внимание пробелы по краям слов, поэтому я добавил шаблон регулярных выражений 5 и сохранил за пределами захваченной группы лучшее, что вы выбрали.

1

Да, что-то вроде ниже будет работать;

import re 
fh = open('test1.txt') 
lines = fh.readlines() 
for line in lines[2:]: 
    p = re.compile(r"\|(?P<id>.*)\|(?P<login>.*)\|(?P<name>.*)\|") 
    if p.search(line): 
     id = re.match(p, line).group('id') 
     login = re.match(p, line).group('login') 
     name = re.match(p, line).group('name') 
     print id.strip(),login.strip(),name.strip() 
4

Если вы не ожидаете фантастических данных, вы можете просто использовать символы слова и цифры.

г "([\ д \ ш] +)

Пример использования ниже

In [27]: data = """+----+---------------+---------------+ 
....:  | Id | Login   | Name   | 
....:  +----+---------------+---------------+ 
....:  | 1 | admin   | admin   | 
....:  | 2 | admin2  | admin2  | 
....:  | 3 | ekaterina  | Ekaterina  | 
....:  | 4 | commarik  | commarik  | 
....:  | 5 | basildrescher | BasilDrescher | 
....:  | 6 | danielalynn | DanielaLynn | 
....:  | 7 | rosez13yipfj | RoseZ13yipfj | 
....:  | 8 | veolanoyes | VeolaNoyes | 
....:  | 9 | angel   | Angel   | 
....:  | 10 | michalea44 | MichaleA44 | 
....:  +----+---------------+---------------+""" 

In [32]: matches = re.findall(r"([\d\w]+)", data) 
In [36]: matches 
Out[36]: ['Id', 'Login', 'Name', '1', 'admin', 'admin', '2', 'admin2', 'admin2', '3', 'ekaterina', 'Ekaterina', '4', 'commarik', 'commarik', '5', 'basildrescher', 'BasilDrescher', '6', 'danielalynn', 'DanielaLynn', '7', 'rosez13yipfj', 'RoseZ13yipfj', '8', 'veolanoyes', 'VeolaNoyes', '9', 'angel', 'Angel', '10', 'michalea44', 'MichaleA44'] 
+0

Это кажется очень элегантным решением, если вы не ожидаете, кроме слов и цифр в Data – user3833838

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