Python正则表达式命名组(0或1个匹配项)

NarūnasK

我正在尝试解析以下行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')

我想念什么?

nu11p01n73R

你想念什么?

.*是非常危险的元序列。它很贪婪,尝试匹配尽可能多的字符。

那就是你写的时候

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python正则表达式命名组以

来自分类Dev

组1不匹配每个正则表达式

来自分类Dev

使用Go正则表达式中的命名匹配项

来自分类Dev

正则表达式组在想要的匹配项之间生成空匹配项

来自分类Dev

Python正则表达式:提取多个匹配组

来自分类Dev

替换正则表达式匹配中的命名组

来自分类Dev

Python正则表达式返回最后一个匹配字符的额外捕获组

来自分类Dev

Golang正则表达式命名组和子匹配项

来自分类Dev

Python正则表达式匹配上一组中匹配的内容(多个选项中的1个)

来自分类Dev

Python正则表达式组

来自分类Dev

c#匹配多个正则表达式组,使每个匹配项/单词分开

来自分类Dev

1组正则表达式匹配项的matchAll数组

来自分类Dev

带有可选组的Python正则表达式,至少匹配一个

来自分类Dev

正则表达式子方法不会替换python正则表达式中的所有匹配项

来自分类Dev

正则表达式命名组

来自分类Dev

Python正则表达式不匹配多个组

来自分类Dev

多行文本的粗略正则表达式,在每个匹配项的末尾具有可选的组和命名捕获

来自分类Dev

从正则表达式获取“组”,而不是匹配项

来自分类Dev

Python正则表达式组

来自分类Dev

c#匹配多个正则表达式组,使每个匹配项/单词分开

来自分类Dev

如何用命名组在Python中编写正则表达式以匹配此规则?

来自分类Dev

正则表达式:跳过组中角色的第一个匹配项?

来自分类Dev

Python正则表达式匹配

来自分类Dev

根据多个已命名的正则表达式匹配项替换字符串的内容

来自分类Dev

用于多行匹配的 Python 正则表达式命名组

来自分类Dev

在 Python 中使用正则表达式查找重叠匹配项和子匹配项

来自分类Dev

正则表达式匹配组

来自分类Dev

python正则表达式可选命名组

来自分类Dev

python正则表达式,只返回第一个匹配项

Related 相关文章

  1. 1

    Python正则表达式命名组以

  2. 2

    组1不匹配每个正则表达式

  3. 3

    使用Go正则表达式中的命名匹配项

  4. 4

    正则表达式组在想要的匹配项之间生成空匹配项

  5. 5

    Python正则表达式:提取多个匹配组

  6. 6

    替换正则表达式匹配中的命名组

  7. 7

    Python正则表达式返回最后一个匹配字符的额外捕获组

  8. 8

    Golang正则表达式命名组和子匹配项

  9. 9

    Python正则表达式匹配上一组中匹配的内容(多个选项中的1个)

  10. 10

    Python正则表达式组

  11. 11

    c#匹配多个正则表达式组,使每个匹配项/单词分开

  12. 12

    1组正则表达式匹配项的matchAll数组

  13. 13

    带有可选组的Python正则表达式,至少匹配一个

  14. 14

    正则表达式子方法不会替换python正则表达式中的所有匹配项

  15. 15

    正则表达式命名组

  16. 16

    Python正则表达式不匹配多个组

  17. 17

    多行文本的粗略正则表达式,在每个匹配项的末尾具有可选的组和命名捕获

  18. 18

    从正则表达式获取“组”,而不是匹配项

  19. 19

    Python正则表达式组

  20. 20

    c#匹配多个正则表达式组,使每个匹配项/单词分开

  21. 21

    如何用命名组在Python中编写正则表达式以匹配此规则?

  22. 22

    正则表达式:跳过组中角色的第一个匹配项?

  23. 23

    Python正则表达式匹配

  24. 24

    根据多个已命名的正则表达式匹配项替换字符串的内容

  25. 25

    用于多行匹配的 Python 正则表达式命名组

  26. 26

    在 Python 中使用正则表达式查找重叠匹配项和子匹配项

  27. 27

    正则表达式匹配组

  28. 28

    python正则表达式可选命名组

  29. 29

    python正则表达式,只返回第一个匹配项

热门标签

归档