2015-09-01 3 views
0

На моей странице администрирования У меня есть список учетных записей с различными значениями, которые я хочу захватить, например, id, name, type и т. Д. На Regex101 он полностью захватывает все значения с помощью "g »и« s ». Это то, что я пытаюсь сделать:Regex не соответствует группам (Python)

def extract_accounts(src): 
     list_accounts = [] 
     try: 
      pattern = re.compile(r'''id=(?P<id>.*?)&serverzone=.\">(?P<name>[a-zA-Z].*?)<\/a>.*?75px;\">(?P<level>.*?)<\/td>.*?75px;.*?75px;\">(?P<type>.*?)<\/td>.*?Open!''', re.X) 
      print type(pattern) 
      match = pattern.match(src) 
      print match, "type=", type(match) 
      name = match.group("name") 
      print "name", name 
      ids = match.group("id") 
      level = match.group("level") 
      type = match.group("type") 
      #list_accounts.append(name, ids, level, type) 
      #print ("id=", ids, ", name=",name," level=", level, " type=", type) 
     except Exception as e: 
      print (e) 

Но каким-то образом я получаю это:

<type '_sre.SRE_Pattern'> 
None type= <type 'NoneType'> 
'NoneType' object has no attribute 'group' 

Я понятия не имею, что я делаю неправильно. В основном, я хочу, чтобы вставить список = [(name1, id1, level1, type), (name2, id2, level1, type) ..... и так далее вещи, которые я беру с каждой строки Спасибо заранее за любую помощь.

+1

Вы можете напечатать некоторую строку образца для проверки –

+0

Несомненно, это ссылка> https://regex101.com/r/vQ8jB0/1 –

+0

Я не могу найти ошибку в регулярном выражении, однако я получаю сообщение об ошибке при запуске ' re.findall() 'из-за специального символа в строке, в вашем случае это • рядом с Evolution. python не может обработать этот –

ответ

1

Вы должны собирать группы по их номеру группы. Я полностью изменил регулярное выражение и реализовать его следующим образом:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import re 

def main(): 
    sample_data = ''' 
    <tr style="background-color: #343222;"> 
     <td style="width: 20px;"><img src="/images/Star.png" style="border: 0px;" /></td> 
     <td><a target="_top" href="adminzone.php?id=2478&serverid=1">Mike</a></td> 
     <td style="text-align: center;width: 75px;">74</td> 
     <td>•Evolu†ion•</td> 
     <td style="text-align: center;width: 100px;">1635</td> 
     <td style="text-align: center;width: 75px;">40,826</td> 
     <td style="text-align: center;width: 75px;">User</td> 
     <td style="width: 100px;"><a target="_top" href="href="adminzone.php"><strong>Open!</strong></a></td> 
    </tr> 
    <tr style="background-color: #3423323;"> 
     <td style="width: 20px;"><img src="/images/Star.png" style="border: 0px;" /></td> 
     <td><a target="_top" href="adminzone.php?suid=24800565&serverid=1">John</a></td> 
     <td style="text-align: center;width: 75px;">70</td> 
     <td>•Evolu†ion•</td> 
     <td style="text-align: center;width: 100px;">9167</td> 
     <td style="text-align: center;width: 75px;">36,223</td> 
     <td style="text-align: center;width: 75px;">Admin</td> 
     <td style="width: 100px;"><a style="color: #00DD19;" target="_top" href="adminzone.php?id=248005&serverid=1"><strong>Open!</strong></a></td> 

''' 

    matchObj = re.search('id=(.*)&serverid=.">(.*)<\\/a><\\/td>\\n.*?75px;\\">(.+)<\\/td>\\n.*\\n.*\\n.*75px;\\">(.+)<\\/td>\\n.*75px;\\">(.+)<\\/td>', sample_data, re.X) 

    if matchObj: 
     user_id = matchObj.group(1) 
     name = matchObj.group(2) 
     level = matchObj.group(3) 
     user_type = matchObj.group(4) 
     print user_id, name, level, user_type 


if __name__ == '__main__': 
    main() 

Выход: 2478 Mike 74 40,826

выше должно дать вам основную идею. Просто вы можете удивиться, group(0) - это все регулярное выражение.

+0

@MikeThunder это решило вашу проблему или нет? Если у вас возникнут какие-либо дальнейшие трудности, дайте мне знать, чтобы я мог помочь дальше. – Juxhin

+0

Я нашел проблему. Забыл добавить re.S для нескольких строк :( –

+0

А теперь, рад, что он работает сейчас – Juxhin

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