正则表达式:将捕获组与OR条件相结合

时间:2018-05-02 21:52:35

标签: python regex

我们说我有一个字符串:

s = "id_john, num847, id_000, num___"

我知道如何使用|检索2种模式中的任何一种:

re.findall("id_[a-z]+|num[0-9]+", s)
#### ['id_john', 'num847'] # OK

我知道如何捕捉仅与括号匹配的部分:

re.findall("id_([a-z]+)", s)
#### ['john']

但是当我尝试将这两个功能结合起来时,我失败了,这是我期望的输出

#### ['john', '847']

感谢您的帮助..(我使用python)

2 个答案:

答案 0 :(得分:2)

你可以在Python中使用这个代码:lookaheads:

>>> s = "id_john, num847, id_000, num___"
>>> print re.findall(r'(?:id_(?=[a-z]+\b)|num(?=\d+\b))([a-z\d]+)', s)
['john', '847']

RegEx详细信息:

  • (?::启动非捕获组
    • id_(?=[a-z]+\b):将id_与先行断言相匹配,以确保我们前面有[a-z]+个字符,然后是字边界
    • |:或
    • num(?=\d+\b))([a-z \ d] + : Match num`带有先行断言,以确保我们前面有数字后跟字边界
  • ):结束非捕获组
  • ([a-z\d]+):将1+个字符与小写字母或数字相匹配

答案 1 :(得分:2)

无需前瞻或复杂的模式。

考虑一下:

>>> re.findall('id_([a-z]+)|num([0-9]+)', s)
[('john', ''), ('', '847')]

当第一个模式匹配时,第一个组将包含匹配,第二个组将为空。当第二个模式匹配时,第一个组为空,第二个组包含匹配。

由于两个小组中的一个总是空的,加入它们不会受到伤害。

>>> [a+b for a,b in re.findall('id_([a-z]+)|num([0-9]+)', s)]
['john', '847']