python - "Optional" backreferences in regular expression -


i have regular expression 2 groups or'd , i'm wondering if it's possible have group reference only if matched? in cases, i'm wanting match spam.eggs.com

example:

import re  monitorname = re.compile(r"hq01 : http service - [ss][rr][vv]\d+\.\w+\.com:(\w+\.\w+\.(?:net|com|org))|(\w+\.\w+\.(?:net|com|org))")  test = ["hq01 : http service - spam.eggs.com",     "hq01 : http service - spam.eggs.com - disabled",     "hq01 : http service - srv04.example.com:spam.eggs.com",     "hq01 : http service - srv04.example.com:spam.eggs.com - disabled"]   t in test:     m = monitorname.search(t)     print m.groups() 

produces:

(none, 'spam.eggs.com') (none, 'spam.eggs.com') ('spam.eggs.com', none) ('spam.eggs.com', none) 

it'd nice if groups return 1 matched group , not both.

the | operator has precedence applies everything before (from beginning of regex in case) or after it. in regex, if there no "srv04.example.com", isn't checking if string contains "http service"!

your 2 capturing groups identical, there's no point in having both. want have srv*: part optional, right?

try one:

r"hq01 : http service - (?:[ss][rr][vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))" 

Comments

Popular posts from this blog

ruby - When to use an ORM (Sequel, Datamapper, AR, etc.) vs. pure SQL for querying -

php - PHPDoc: @return void necessary? -

c++ - Convert big endian to little endian when reading from a binary file -