python: многострочное регулярное выражение - PullRequest
2 голосов
/ 25 мая 2010

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

#!/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)

Ответы [ 3 ]

5 голосов
/ 25 мая 2010

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

re.findall(r'Hello, (?P<login>[^.]+)\..+?hash: (?P<hash>[^.]+)', test_str, re.S)
2 голосов
/ 25 мая 2010

Простой 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
2 голосов
/ 25 мая 2010
name_hash_pair = re.findall('Hello, ([^.]+).*?hash: ([^.]+)', test_str, re.DOTALL)
#gives [('UserName', 'fdaf9399jef9qw0j'), ('UserName2', 'gtwnhton340gjr2g')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...