SIP URI变量的Python正则表达式? - python

我将此正则表达式用于SIP(会话发起协议)URI,以提取不同的内部变量。

_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()

我需要修改此表达式以支持IPv6并匹配所有不同类型的SIP URI。基本思想是IPv4显示的格式为192.168.0.1和IPv6 2620:0:2ef0:7070:250:60ff:fe03:32b7。因为端口号在:之后,所以IPv6在SIP URI的中间。

其一般形式为:

sip:user:password @ host:port; uri-parameters?headers

这些是一些示例:

uriList = [
   'sip:192.1.2.3',
   'sip:[email protected]',
   '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:[email protected]',
   'sip:[email protected]:6000',
   'sip:thks.ashwin:[email protected]',
   ]

输出量

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表达式,但是没有运气=´(

我一直在使用https://pythex.org/来测试结果。

参考方案

您的示例中没有标题和参数,因此我不知道它们如何显示。但是您可以使用以下代码来匹配示例字符串:

[EDIT1-添加了正则表达式以匹配主机名字符串和对用户:密码的支持,基于OP的新示例URI]

[EDIT2-添加了参数和标头正则表达式,并在正则表达式的“或”部分添加了更多注释]

import re

uriList = [
        'sip:192.1.2.3',
        'sip:[email protected]',
        '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:[email protected]',
        'sip:[email protected]:6000',
        'sip:support:[email protected]',
        'sip:support:[email protected];urlparams=test',
        'sip:support:[email protected]?auth=basic',
        'sip:support:[email protected];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

试试看,看看是否适合您

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

为什么我无法更新字典中的test__user_id密钥? - python

我正在更新包含数据的字典,dict_temp = {'description': 'hello', 'id': 683, 'status': u'pending', 'test__user_id': 430} 我试图使用dict_temp …

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…