正则表达式捕获由重复组组成的整个匹配

时间:2011-08-30 14:22:54

标签: python regex

我看过论坛但却找不到究竟如何解决我的问题。

假设我有一个如下字符串:

UDK .636.32/38.082.4454.2(575.3)

我希望将表达式与正则表达式匹配,捕获实际数字(在本例中为'.636.32 / 38.082.4454.2(575.3)')。

'UDK'和实际数字之间可能有一些乱码,而'。','/'或' - '等字符是数字的有效部分。本质上,数字是由一些允许的字符分隔的数字序列。

我想出的是以下正则表达式:

'UDK.*(\d{1,3}[\.\,\(\)\[\]\=\'\:\"\+/\-]{0,3})+'

但它没有对'.636.32 / 38.082.4454.2(575.3)'进行分组!它只剩下最后一组的最后一位数字(本例中为3)。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

首先,你需要一个非贪婪的.*?。 其次,你不需要逃避[ ]中的一些字符。 第三,您可能只是将其视为一系列数字和一些允许的字符?为什么有\d{1,3}4454

>>> re.match(r'UDK.*?([\d.,()\[\]=\':"+/-]+)', s).group(1)
'.636.32/38.082.4454.2(575.3)'

答案 1 :(得分:0)

与您的问题不是直接的答案,而是一般的正则表达式提示:使用Kodos(http://kodos.sourceforge.net/)。它只是 awesome 用于编写/测试regexp。您可以输入一些示例文本,并“试用”正则表达式,查看匹配,组等。它甚至会在您完成后生成Python代码。好东西。

编辑:使用Kodos我想出了:

UDK.*?(?P<number>[\d/.)(]+)

作为匹配给定示例的正则表达式。 Kodos生成的代码是:

import re

rawstr = r"""UDK.*?(?P<number>[\d/.)(]+)"""
matchstr = """UDK .636.32/38.082.4454.2(575.3)"""

# method 1: using a compile object
compile_obj = re.compile(rawstr)
match_obj = compile_obj.search(matchstr)

# Retrieve group(s) by name
number = match_obj.group('number')