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

标签 python regex expression sip

我使用 SIP(​​ session 启动协议(protocol))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: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',
   ]

输出

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 - 添加了参数和 header 正则表达式,并对正则表达式的“OR”部分进行了更多评论]

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

尝试一下,看看它是否适合您

关于SIP URI 变量的 Python 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516948/

相关文章:

javascript - RegExp,如何在 javascript 中连接字符串来创建动态正则表达式?

python - geodjango(postgis)中两个3D点之间的距离

python - PyQt 小部件重新加载或刷新

c# - 如何从表达式属性中获取名称?

c# - 如何从字符串中获取变量

ruby - 正则表达式:如果字符串包含空格则不匹配

c# - 快速获取 Expression 方法调用目标的方法

~/.zshrc 中的 python 别名覆盖虚拟环境源

python - Keras 密集输出层形状错误

regex - 如何在某些文本的末尾获得 "->function(' xxx' ,'xxx' )"