我尝试读取以下结构(python):
a1a:bb2b,c3cc,dd44d;e5eee:ff66,g7;h8h:i9
(它们之间没有空格!),理想情况下像这样
((a1a, (bb2b, c3cc, dd44d)),
(e5eee, (ff66, g7)),
(h8h, (i9)))
带文字:1个或更多组。每组一个头,后跟一个“:”和一个或多个项目,以“,”分隔。这些组用“;”分隔。每个项目都是字母数字,包括“ _”。
我尝试使用正则表达式(由于第四只鸟的贡献(?:; | $)):
(\w+):(?:(\w+)|(?:,(\w+)(?=,))|(?:,(\w+)))+(?:;|$)
它提供以下结果:
((a1a, bb2b, c3cc, dd44d),
(e5eee, ff66, g7),
(h8h, i9))
这总比没有好,但是还没有要求的确切输出格式。
有人知道如何调整正则表达式以准确获得所需结果吗?恐怕一般不可能像(a1a,(bb2b,c3cc,dd44d))中那样获得(bb2b,c3cc,dd44d)之类的嵌套组,不是吗?
在此先感谢您的提示。 mdew
答案 0 :(得分:1)
您可以使用2个捕获组,然后匹配分号或字符串的末尾。然后,在替换中,您可以使用将它们与括号组合在一起的那些组:
(\w+):(\w+(?:,\w+)*)(?:;|$)
说明
(\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