Python regex for SIP URI variables?

I use this regular expression for SIP (Session Initiation Protocol) URIs to extract various internal variables.

_syntax = re.compile('^(?P<scheme>[a-zA-Z][a-zA-Z0-9\+\-\.]*):' # scheme + '(?:(?:(?P<user>[a-zA-Z0-9\-\_\.\!\~\*\'\(\)&=\+\$,;\?\/\%]+)' # user + '(?::(?P<password>[^:@;\?]+))?)@)?' # password + '(?:(?:(?P<host>[^;\?:]*)(?::(?P<port>[\d]+))?))' # host, port + '(?:;(?P<params>[^\?]*))?' # parameters + '(?:\?(?P<headers>.*))?$') # headers m = URI._syntax.match(value) if m: self.scheme, self.user, self.password, self.host, self.port, params, headers = m.groups() 

I need to modify this expression to support IPv6 and map all types of SIP URIs. The basic idea is that IPv4 shows the form 192.168.0.1 and IPv6 2620: 0: 2ef0: 7070: 250: 60ff: fe03: 32b7. Beacause the port number after :, IPv6 is between commands in the SIP URI.

Its general appearance:

throat: user: password @ host: port, uri header options

Here are some examples:

 uriList = [ 'sip:192.1.2.3', 'sip: 123@192.1.2.3 ', 'sip:192.1.2.3:5060', 'sips: 123@ [2620:0:2ef0:7070:250:60ff:fe03:32b7]', 'sip:[2620:0:2ef0:7070:250:60ff:fe03:32b7]', 'sip:[2620:0:2ef0:7070:250:60ff:fe03:32b7]:5060', 'sips: support@voip.example.com ', 'sip: 22444032@voip.example.com :6000', 'sip:thks.ashwin: pass@212.123.1.213 ', ] 

Exit

 Scheme: sip, User: , Host: 192.1.2.3, Port: Scheme: sip, User: 123, Host: 192.1.2.3, Port: Scheme: sip, User: , Host: 192.1.2.3, Port: 5060 Scheme: sips, User: 123, Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: Scheme: sip, User: , Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: Scheme: sip, User: , Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: 5060 Scheme: sips, User:support , Host: voip.example.com Scheme: sip, User:22444032 , Host: voip.example.com, Port: 6000 Scheme: sip, User:thks.ashwin, Password:pass ,Host: 212.123.1.213 

I tried changing the host expression to match the expression [IPv6] and IPv4, but without luck = '(

I used https://pythex.org/ to check the results.

+5
source share
1 answer

There are no headers and parameters in your example, so I donโ€™t know how they appear. But you can use the following code to match the lines of the example:

[EDIT1 - added regular expression to match hostname strings and user support: password based on new OPs URI examples]

[EDIT2 - added regular expression params and headers and commented on the "OR" part of the regular expression]

 import re uriList = [ 'sip:192.1.2.3', 'sip: 123@192.1.2.3 ', 'sip:192.1.2.3:5060', 'sip: 123@ [2620:0:2ef0:7070:250:60ff:fe03:32b7]', 'sip:[2620:0:2ef0:7070:250:60ff:fe03:32b7]', 'sip:[2620:0:2ef0:7070:250:60ff:fe03:32b7]:5060', 'sips: support@voip.example.com ', 'sip: 22444032@voip.example.com :6000', 'sip:support: pass@212.123.1.213 ', 'sip:support: pass@212.123.1.213 ;urlparams=test', 'sip:support: pass@212.123.1.213 ?auth=basic', 'sip:support: pass@212.123.1.213 ;urlparams=test?auth=basic', ] mPattern = re.compile( '(?P<scheme>\w+):' #Scheme +'(?:(?P<user>[\w\.]+):?(?P<password>[\w\.]+) ?@ )?' #User:Password +'\[?(?P<host>' #Begin group host +'(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|' #IPv4 address Host Or +'(?:(?:[0-9a-fA-F]{1,4}):){7}[0-9a-fA-F]{1,4}|' #IPv6 address Host Or +'(?:(?:[0-9A-Za-z]+\.)+[0-9A-Za-z]+)'#Hostname string +')\]?:?' #End group host +'(?P<port>\d{1,6})?' #port +'(?:\;(?P<params>[^\?]*))?' # parameters +'(?:\?(?P<headers>.*))?' # headers ) groupNamesList = ['scheme', 'user', 'password', 'host', 'port', 'params', 'headers'] #List of group Names for uri in uriList: #iterate through the list of uri mObject = mPattern.search(uri) #pattern search if mObject: #if you find a match groupStrings = [mObject.group(groupName) if mObject.group(groupName) else '' for groupName in groupNamesList] #extract your groupStrings print('Scheme: {0}, User: {1}, Password: {2}, Host: {3}, Port: {4}, Params: {5}, Headers: {6}'.format(*groupStrings)) #print groupStrings 

The result I get:

 Scheme: sip, User: , Password: , Host: 192.1.2.3, Port: , Params: , Headers: Scheme: sip, User: 123, Password: , Host: 192.1.2.3, Port: , Params: , Headers: Scheme: sip, User: , Password: , Host: 192.1.2.3, Port: 5060, Params: , Headers: Scheme: sip, User: 123, Password: , Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: , Params: , Headers: Scheme: sip, User: , Password: , Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: , Params: , Headers: Scheme: sip, User: , Password: , Host: 2620:0:2ef0:7070:250:60ff:fe03:32b7, Port: 5060, Params: , Headers: Scheme: sips, User: support, Password: , Host: voip.example.com, Port: , Params: , Headers: Scheme: sip, User: 22444032, Password: , Host: voip.example.com, Port: 6000, Params: , Headers: Scheme: sip, User: support, Password: pass, Host: 212.123.1.213, Port: , Params: , Headers: Scheme: sip, User: support, Password: pass, Host: 212.123.1.213, Port: , Params: urlparams=test, Headers: Scheme: sip, User: support, Password: pass, Host: 212.123.1.213, Port: , Params: , Headers: auth=basic Scheme: sip, User: support, Password: pass, Host: 212.123.1.213, Port: , Params: urlparams=test, Headers: auth=basic 

Try it and see if it works for you.

+4
source

Source: https://habr.com/ru/post/1201194/


All Articles