尝试使用regexp读取嵌套结构

时间:2019-02-06 12:20:03

标签: regex python-2.7

我尝试读取以下结构(python):

a1a:bb2b,c3cc,dd44d;e5eee:ff66,g7;h8h:i9

(它们之间没有空格!),理想情况下像这样

((a1a, (bb2b, c3cc, dd44d)),
 (e5eee, (ff66, g7)),
 (h8h, (i9)))

带文字:1个或更多组。每组一个头,后跟一个“:”和一个或多个项目,以“,”分隔。这些组用“;”分隔。每个项目都是字母数字,包括“ _”。

我尝试使用正则表达式(由于第四只鸟的贡献(?:; | $)):

(\w+):(?:(\w+)|(?:,(\w+)(?=,))|(?:,(\w+)))+(?:;|$)

as shown here

它提供以下结果:

((a1a, bb2b, c3cc, dd44d),
 (e5eee, ff66, g7),
 (h8h, i9))

这总比没有好,但是还没有要求的确切输出格式。

有人知道如何调整正则表达式以准确获得所需结果吗?恐怕一般不可能像(a1a,(bb2b,c3cc,dd44d))中那样获得(bb2b,c3cc,dd44d)之类的嵌套组,不是吗?

在此先感谢您的提示。 mdew

1 个答案:

答案 0 :(得分:1)

您可以使用2个捕获组,然后匹配分号或字符串的末尾。然后,在替换中,您可以使用将它们与括号组合在一起的那些组:

(\w+):(\w+(?:,\w+)*)(?:;|$)

Regex demo | Python demo

说明

  • (\w+)分组捕获1个以上的单词字符
  • :匹配:
  • (捕获组
    • \w+(?:,\w+)*匹配1+个单词字符,然后匹配一个重复0+次逗号和1+个单词字符的组
  • )封闭小组
  • (?:;|$)匹配;或字符串的结尾

在替换中,您可以使用它,并且它们会删除结尾的逗号和换行符

(\1(\2)),\n

编辑:

要获取元组列表,您可以使用相同的正则表达式,并用逗号将第二组分开并创建一个元组:

import re
text = "a1a:bb2b,c3cc,dd44d;e5eee:ff66,g7;h8h:i9"
matches = re.findall("(\w+):(\w+(?:,\w+)*)(?:;|$)", text)
matches  = list(map(lambda x: (x[0], tuple(x[1].split(','))), matches))
print (matches)

结果:

[('a1a', ('bb2b', 'c3cc', 'dd44d')), ('e5eee', ('ff66', 'g7')), ('h8h', ('i9',))]

请参见Python demo