SIPURI变量的Python正则表达式?
我正在为SIP(会话启动协议)URI使用这个正则表达式来提取不同的内部变量SIPURI变量的Python正则表达式?,python,regex,expression,sip,Python,Regex,Expression,Sip,我正在为SIP(会话启动协议)URI使用这个正则表达式来提取不同的内部变量 _syntax = re.compile('^(?P<scheme>[a-zA-Z][a-zA-Z0-9\+\-\.]*):' # scheme + '(?:(?:(?P<user>[a-zA-Z0-9\-\_\.\!\~\*\'\(\)&=\+\$,;\?\/\%]+)' # user + '(?::(?P<password>[^:@;\?]
_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()
输出
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
我试图修改主机表达式以匹配[IPv6]和IPv4表达式,但没有运气='(
我一直在使用来测试结果。您的示例中没有标题和参数,因此我不知道它们是如何显示的。但是您可以使用以下代码来匹配示例字符串: [EDIT1-添加正则表达式以匹配主机名字符串和对user:password的支持,基于新的示例URI] [EDIT2-添加了参数和标题正则表达式,并对正则表达式的“或”部分进行了更多注释]
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
尝试一下,看看它是否适合您谢谢Ashwin!!这确实很有帮助,但仍需要一些修复。我将添加一些其他示例,因为SIP URI非常灵活,并且您的解决方案与某些解决方案不匹配。例如,主机可以是类似“voip.server.com”的名称并且可以在用户之后添加密码。我的意图是仅扩展主机部分以匹配IPv6。我看到您使用了一种“或”表达式,但我不确定如何使用它使我的示例生效。@user3764940:我用来查看正则表达式的流。它提供了选项的良好图形视图。您还可以遍历字符串的各个部分,查看该字符串必须与您的模式相匹配的选项。这意味着在这种情况下,用户可以在场也可以不在场。您可以可以遍历示例字符串,查看何时捕获用户以及何时跳过用户。它还提供了“或”(|)匹配模式的视图,帮助您了解更好这正是我需要的!谢谢Ashwin!!
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
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