我看过论坛但却找不到究竟如何解决我的问题。
假设我有一个如下字符串:
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)。
非常感谢任何帮助。
答案 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')