我很困惑在Python中返回多个组。我的RegEx是这样的:
lun_q = 'Lun:\s*(\d+\s?)*'
我的字符串是
s = '''Lun: 0 1 2 3 295 296 297 298'''`
我返回一个匹配的对象,然后想要查看这些组,但所有它都显示了最后一个数字(258):
r.groups()
(u'298',)
为什么不归还0,1,2,3,4
等组?
答案 0 :(得分:27)
您的正则表达式只包含一对括号(一个捕获组),因此您只能在匹配中获得一个组。如果您在捕获组(+
或*
)上使用重复运算符,则每次重复该组时都会“覆盖”该组,这意味着只捕获最后一个匹配项。
在您的示例中,您可能最好使用.split()
与正则表达式结合使用:
lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)'
s = '''Lun: 0 1 2 3 295 296 297 298'''
r = re.search(lun_q, s)
if r:
luns = r.group(1).split()
# optionally, also convert luns from strings to integers
luns = [int(lun) for lun in luns]
答案 1 :(得分:7)
有时候,没有正则表达式会更容易。
>>> s = '''Lun: 0 1 2 3 295 296 297 298'''
>>> if "Lun: " in s:
... items = s.replace("Lun: ","").split()
... for n in items:
... if n.isdigit():
... print n
...
0
1
2
3
295
296
297
298
答案 2 :(得分:4)
另一种方法是使用正则表达式来验证数据,然后使用更具体的正则表达式,使用匹配迭代器来定位您希望提取的每个项目。
import re
s = '''Lun: 0 1 2 3 295 296 297 298'''
lun_validate_regex = re.compile(r'Lun:\s*((\d+)(\s\d+)*)')
match = lun_validate_regex.match(s)
if match:
token_regex = re.compile(r"\d{1,3}")
match_iterator = token_regex.finditer(match.group(1))
for token_match in match_iterator:
#do something brilliant
答案 3 :(得分:0)
如果您正在寻找输出,例如0,1,2,3,4等 答案非常简单,请参阅下面的代码。
打印re.findall(' \ d',s)