我正在尝试解析以下行Python:
s='SIP/200259 (In use) has taken 6 calls (last was 8932 secs ago) (order: 0)'
因此,我制作了我的正则表达式:
sip_patt = re.compile(r'''SIP/(?P<ext>\d+).* # Extension
(?P<inuse>In\suse).* # Speaking
has\staken\s(?P<taken>\d+|no).* # Taken
last\swas\s(?P<last>\d+).* # Last Seen
order:\s(?P<order>\d+).* # Order in the queue''', re.X)
这样会产生期望的结果:
sip_patt.match(s).groups()
('200259', 'In use', '6', '8932', '0')
但是,有时初始字符串可能显示如下(在括号中请注意“未使用”):
s='SIP/200259 (Not in use) has taken 6 calls (last was 8932 secs ago) (order: 0)'
因此,为了避免所有“ if”和“ elses”,我想稍微更改捕获逻辑以匹配命名组“ inuse”的0或1个实例,但是这根本行不通。通过增加 ”?” 或{0,1}在我的命名组旁边,我总是找不到匹配项:
s='SIP/200259 (In use) has taken 6 calls (last was 8932 secs ago) (order: 0)'
sip_patt = re.compile(r'''SIP/(?P<ext>\d+).* # Extension
(?P<inuse>In\suse)?.* # Speaking
has\staken\s(?P<taken>\d+|no).* # Taken
last\swas\s(?P<last>\d+).* # Last Seen
order:\s(?P<order>\d+).* # Order in the queue''', re.X)
sip_patt.match(s).groups()
('200259', None, '6', '8932', '0')
我想念什么?
你想念什么?
这.*
是非常危险的元序列。它很贪婪,尝试匹配尽可能多的字符。
那就是你写的时候
SIP/(?P<ext>\d+).*
在.*
将匹配任何东西,包括(In use)
在paranthesis。因为(?P<inuse>In\suse)?
是可选字段,而regex机器在前面.*
如何改正
您可以限制哪些遵循SIP digits
与实例很显然,In use
与开始(
因此而不是匹配任何与.*
我们将尝试像[^(]
这将匹配比其他任何东西(
。这样可以确保仅匹配到(
,并且In use
可以安全地匹配(?P<inuse>In\suse)?
例子:
>>> sip_patt = re.compile(r'''SIP/(?P<ext>\d+)[^(]* # Extension
... \((?P<inuse>In\suse)?\).* # Speaking
... has\staken\s(?P<taken>\d+|no).* # Taken
... last\swas\s(?P<last>\d+).* # Last Seen
... order:\s(?P<order>\d+).* # Order in the queue''', re.X)
>>> sip_patt.match(s).groups()
('200259', 'In use', '6', '8932', '0')
注意:我限制?P<inuse>In\suse)?
在a范围内\( \)
,以使其适合于安全性
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句