首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有多个组的RegEx?

具有多个组的RegEx?
EN

Stack Overflow用户
提问于 2011-02-11 06:57:48
回答 3查看 58K关注 0票数 44

我对在Python中返回多个组感到困惑。我的RegEx是这样的:

代码语言:javascript
复制
lun_q = 'Lun:\s*(\d+\s?)*'

我的字符串是

代码语言:javascript
复制
s = '''Lun:                     0 1 2 3 295 296 297 298'''`

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

代码语言:javascript
复制
r.groups()  
(u'298',)

为什么它不返回0,1,2,3,4等的组?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-11 06:59:16

您的正则表达式只包含一对括号(一个捕获组),因此在您的匹配中只有一个组。如果在捕获组(+*)上使用重复操作符,则每次重复该组时,该组都会被“覆盖”,这意味着只捕获最后一个匹配项。

在这里的示例中,最好结合使用.split()和正则表达式:

代码语言:javascript
复制
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]
票数 37
EN

Stack Overflow用户

发布于 2011-02-11 07:24:21

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

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2011-02-11 08:07:41

有时,没有正则表达式会更容易。

代码语言:javascript
复制
>>> 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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4963691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档