我们说我有一个字符串:
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)
答案 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']