协助Python正则表达式

时间:2016-08-28 16:22:31

标签: python regex

我有以下字符串。

示例:

  • 12 CG GRB
  • 6GRC 11.2 MK
  • 2 GR 1.75LRG

我想将它们分成以下组

  • [12,CG] [GRB]
  • [6,GRC] [11.2,MK]
  • [2,GR] [1.75,LRG]

我正在使用这个正则表达式 - (\ d +。?\ d *)。*?([A-Z] +)但是有了它,我无法正确捕获第一个例子。而不是[12,CG] [GRB],我得到[12,CG]。

非常感谢任何帮助。

import re
p = re.compile(ur'(\d+\.?\d*).*?([A-Z]+)')
test_str = u"12 CG GRB"

re.findall(p, test_str)

2 个答案:

答案 0 :(得分:0)

您可以将.*?替换为\s*以匹配零个或多个whitespasces,并使第一个捕获组成为可选:

(\d*\.?\d+)?\s*([A-Z]+)
           ^^^^

请参阅regex demo

注意我还将数字匹配子模式修改为\d*\.?\d+以及.56之类的数学数字。你可以保留自己的模式。

模式详细信息

  • (\d*\.?\d+)? - 可选的第1组捕获
    • \d* - 零个或多个数字
    • \.? - 一个可选的点
    • \d+ - 一位或多位
  • \s* - 零个或多个空格
  • ([A-Z]+) - 第2组捕获一个或多个大写ASCII字母。

要将捕获组内容作为元组列表获取,请使用re.findalldemo):

import re
p = re.compile(r'(\d*\.?\d+)?\s*([A-Z]+)')
s = "12 CG GRB\n6GRC 11.2 MK\n2 GR 1.75LRG"
print(p.findall(s))

答案 1 :(得分:0)

s = "12 CG GRB\n6GRC 11.2 MK\n2 GR 1.75LRG"
re.split(r"(?<!\d)\s", s)

输出结果为:

['12 CG', 'GRB', '6GRC', '11.2 MK', '2 GR', '1.75LRG']