我开始用正则表达式冒险。 我有兴趣拆分特殊格式的字符串。如果一个字母不在括号内,它应该成为输出列表的不同元素。括号内的字母应放在一起。
样品:
my string =>通缉名单
"ab(hpl)x"
=> ['a', 'b', 'hpl', 'x']
"(pck)(kx)(sd)"
=> ['pck', 'kx', 'sd']
"(kx)kxx(kd)"
=> ['kx', 'k', 'x', 'x', 'kd']
"fghk"
=> ['f', 'g', 'h', 'k']
如何使用正则表达式和re.split
来实现?
在此先感谢您的帮助。
答案 0 :(得分:5)
使用re.split
无法做到这一点,因为它需要拆分零长度匹配。
来自http://docs.python.org/library/re.html#re.split:
请注意,split不会在空模式匹配上拆分字符串。
这是另一种选择:
re.findall(r'(\w+(?=\))|\w)', your_string)
一个例子:
>>> for s in ("ab(hpl)x", "(pck)(kx)(sd)", "(kx)kxx(kd)", "fghk"):
... print s, " => ", re.findall(r'(\w+(?=\))|\w)', s)
...
ab(hpl)x => ['a', 'b', 'hpl', 'x']
(pck)(kx)(sd) => ['pck', 'kx', 'sd']
(kx)kxx(kd) => ['kx', 'k', 'x', 'x', 'kd']
fghk => ['f', 'g', 'h', 'k']
答案 1 :(得分:1)
您希望findall
不是split
。使用此re:r'(?<=\()[a-z]+(?=\))|[a-z]'
,适用于所有测试用例。
>>> test_cases = ["ab(hpl)x", "(pck)(kx)(sd)", "(kx)kxx(kd)", "fghk"]
>>> pat = re.compile(r'(?<=\()[a-z]+(?=\))|[a-z]')
>>> for test_case in test_cases:
... print "%-13s => %s" % (test_case, pat.findall(test_case))
...
ab(hpl)x => ['a', 'b', 'hpl', 'x']
(pck)(kx)(sd) => ['pck', 'kx', 'sd']
(kx)kxx(kd) => ['kx', 'k', 'x', 'x', 'kd']
fghk => ['f', 'g', 'h', 'k']
修改强>
如果要匹配大写和小写字母,数字和下划线,请将[a-z]
替换为\w
。如果括号永远不会失衡((?<=\()
),则可以删除lookbehind断言"abc(def"
。