2010-05-25 3 views
2

У меня есть фрагмент текста, и я должен разбирать имена пользователей и хэши. Сейчас я делаю это с двумя регулярными выражениями. Могу ли я сделать это только с одним многострочным регулярным выражением?python: многострочное регулярное выражение

#!/usr/bin/env python 

import re 

test_str = """ 
Hello, UserName. 
Please read this looooooooooooooooong text. hash 
Now, write down this hash: fdaf9399jef9qw0j. 
Then keep reading this loooooooooong text. 

Hello, UserName2. 
Please read this looooooooooooooooong text. hash 
Now, write down this hash: gtwnhton340gjr2g. 
Then keep reading this loooooooooong text. 
""" 

logins = re.findall('Hello, (?P<login>.+).',test_str) 
hashes = re.findall('hash: (?P<hash>.+).',test_str) 

ответ

5

Попробуйте это:

re.findall(r'Hello, (?P<login>[^.]+)\..+?hash: (?P<hash>[^.]+)', test_str, re.S) 
+0

или даже: 're.findall (г» (? s) Здравствуйте, (? P [^.] +) \ .. +? Hash: (? P [^.] +) ', Test_str) '(то есть включить флаг внутри шаблона) – tzot

2
name_hash_pair = re.findall('Hello, ([^.]+).*?hash: ([^.]+)', test_str, re.DOTALL) 
#gives [('UserName', 'fdaf9399jef9qw0j'), ('UserName2', 'gtwnhton340gjr2g')] 
2

Простой pyparsing версия:

from pyparsing import * 

username = Word(alphas,alphanums+"_") 
hash = Word(alphanums) 

patt = ("Hello," + username("username") + '.' + 
     SkipTo("write down this hash:", include=True) + 
     hash("hash")) 

for tokens,start,end in patt.scanString(test_str): 
    print tokens.hash, '->', tokens.username 

# or to build a dict 
hashNameLookup = dict((t.hash, t.username) 
           for t,s,e in patt.scanString(test_str)) 

Печать:

fdaf9399jef9qw0j -> UserName 
gtwnhton340gjr2g -> UserName2 
Смежные вопросы