捕获一组中的多个子字符串

时间:2019-03-22 02:15:52

标签: python regex

现在,我有一个文件夹路径,其中将包含数据库表名称和ID,如下所示:

path = '/something/else/TableName/000/123/456/789'

我当然可以匹配TableName/000/123/456/789,然后用python脚本分割它们。

import re
matched = re.findall(r'.*?/(\w+(?:/\d+){4})', path)[0]  # TableName/000/123/456/789
split_text = matched.split('/')  # ['TableName', '000', '123', '456', '789']
table_name = split_text[0]  # 'TableName'
id = int(''.join(split_text[1:]))  # 123456789

.*?/(\w+(?:/\d+){4})

但是我想知道,正则表达式提供的任何功能是否可以一步完成?我已经尝试过以下方法:

re.match(r'.*?/(?P<table_name>\w+)(?:/(?P<id>\d+)){4}', path).groupdict()  # {'table_name': 'TableName', 'id': '789'}
re.split(r'.*?/(\w+)(?:/(\d+)){4}', path)  # ['', 'TableName', '789', '']
re.sub(r'(.*?/)\w+(?:(/)\d+){4}', '', path)  # '', full string has been replaced

.*?/(?P\w+)(?:/(?P\d+)){4}

.*?/(\w+)(?:/(\d+)){4}

还有其他地方吗?还是我必须使用上面的python脚本?我希望结果是{'table_name': 'TableName', 'id': '000123456789'}('TableName', '000123456789'),至少是('TableName', '000', '123', '456', '789')

2 个答案:

答案 0 :(得分:1)

最简单的方法是避免使用量词:

re.findall('(\w+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)', path)

[('TableName', '000', '123', '456', '789')]

答案 1 :(得分:0)

最简单的方法是扩展分组。

>>> match=re.search(r'.*?/(\w+)(?:/(\d+))(?:/(\d+))(?:/(\d+))(?:/(\d+))',a)
>>> match.groups()
('TableName', '000', '123', '456', '789')