怎么把我的琴弦分开重新分割?

2024-06-02 00:58:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我从正则表达式开始我的冒险。 我对拆分特殊格式的字符串感兴趣。如果一个字母不在括号内,它应该成为输出列表的另一个元素。分组在括号内的字母应该放在一起。在

样品:

我的字符串=>;通缉名单

  • "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来实现它? 提前谢谢你的帮助。在


Tags: 字符串gt元素列表格式字母样品sd
2条回答

你想要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。如果括号永远不会不平衡("abc(def"),则可以删除lookbehind断言(?<=\())。在

这不能用re.split完成,因为它需要对零长度匹配进行拆分。在

来自http://docs.python.org/library/re.html#re.split

Note that split will never split a string on an empty pattern match.

另一种选择是:

re.findall(r'(\w+(?=\))|\w)', your_string)

还有一个例子:

^{pr2}$

相关问题 更多 >