Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用re.split分割我的字符串?_Python_Regex_Split - Fatal编程技术网

Python 如何使用re.split分割我的字符串?

Python 如何使用re.split分割我的字符串?,python,regex,split,Python,Regex,Split,我从正则表达式开始我的冒险。 我对分割特殊格式的字符串感兴趣。如果一个字母不在括号内,它应该成为输出列表的另一个元素。括号内的字母应放在一起 样本: 我的字符串=>通缉名单 “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? 提前感谢您的帮助。

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

样本:

我的字符串=>通缉名单

  • “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

提前感谢您的帮助。

这不能用
re.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']

使用
re.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']

您想要的是
findall
而不是
split
。使用此re:
r'(?您想要
findall
而不是
split
。使用此re:
r'(?@Maciej Ziarko:请注意,通过使用
'\w'
和无后顾断言,此答案假设括号将始终保持平衡,并且您的数据中从不包含数字和下划线。鉴于您的测试数据,这是一个公平的假设,因此+1。是的,它们将始终保持平衡。我的数据中的任何其他字符都是小字符呃。我喜欢你的两个答案,我对它们都投了赞成票。顺便问一下:你能推荐一本好的正则表达式教程/书籍吗?我主要用于学习,对于快速测试正则表达式非常有用。@Maciej Ziarko:请注意,这个答案通过使用
'\w'
和无后视断言假设pare假设你的测试数据中没有数字和下划线,所以+1是公平的。是的,它们总是平衡的。我的数据中的任何其他字符都是小写字母。我喜欢你的两个答案,我对它们都投了赞成票。顺便问一句:你能推荐一些好的正则表达式教程/书籍吗很好的例子?我主要用于学习,对于快速测试正则表达式非常有用。