RegEx有多个组?

jos*_*inm 34 python regex

我很困惑在Python中返回多个组.我的RegEx是这样的:

lun_q = 'Lun:\s*(\d+\s?)*'
Run Code Online (Sandbox Code Playgroud)

我的字符串是

s = '''Lun:                     0 1 2 3 295 296 297 298'''`
Run Code Online (Sandbox Code Playgroud)

我返回一个匹配的对象,然后想要查看这些组,但它显示的是最后一个数字(258):

r.groups()  
(u'298',)
Run Code Online (Sandbox Code Playgroud)

为什么不回归0,1,2,3,4等等?

Ben*_*ank 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]
Run Code Online (Sandbox Code Playgroud)

  • 挑选`re.match()`vs`re.split()`是一个非平凡的决定 (4认同)

kur*_*umi 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
Run Code Online (Sandbox Code Playgroud)


pok*_*tad 6

另一种方法是使用您必须验证数据的正则表达式,然后使用更具体的正则表达式来定位您希望使用匹配迭代器提取的每个项目。

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
Run Code Online (Sandbox Code Playgroud)

  • 打印 re.findall('\d',s) (2认同)

Rak*_*mar 5

如果你正在寻找一个输出,如0,1,2,3,4等答案很简单,看看下面的代码。

打印 re.findall('\d',s)