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

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

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -