Python:正则表达式在空间上分裂(但在[]中保持元素不分裂)并添加" "在数组中作为Newline的符号

时间:2017-10-16 12:22:05

标签: python regex

基本上想象一下,如果我有这样的一行:

"Hello world
I am Lucas [help me]
Hi" 

我希望re.split()的结果为:

['Hello' 'world' '' 'I' 'am' 'Lucas' '[help me] '' 'Hi']

截至目前,我已尝试使用

re.split(r'\s+(?=[^()]*(?:\[|\<|$))', stringToSplit) 

但我不确定如何添加&#39;&#39;作为换行符。我试过了:

result = re.split(r'\s|\n+(?=[^()]*(?:\[|\<|$))', input)

然而,这会导致[帮助我]的问题,因为它将其分成'[help' and 'me]'。有没有解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以使用匹配的方法提取方括号内的所有子字符串,或非空格块,或者在换行符之前使用空白字符

\[[^[]*]|\([^)]*\)|<[^>]*>|\S+|(?=\n)

请参阅regex demo

<强>详情

  • \[[^]]*] - [后跟]以外的任何0 +字符,然后是]
  • | - 或
  • \([^)]*\) - (后跟除)以外的任何字符,然后)
  • | - 或
  • <[^>]*> - <后跟>以外的任何0 +字符,然后是>
  • | - 或
  • \S+ - 一个或多个非空白字符
  • | - 或
  • (?=\n) - \n换行符之前的空字符串。

请参阅Python demo

re.findall(r"\[[^[]*]|\([^)]*\)|<[^>]*>|\S+|(?=\n)", s)
# => ['Hello', 'world', '', 'I', 'am', 'Lucas', '[help me]', '(help me 2)', '<help me 3>', '', 'Hi']

答案 1 :(得分:0)

使用newer regex module,你可以相处:

import regex as re

string = """Hello world
I am Lucas [help me]
Hi"""

rx = re.compile(r'\[[^][]*\](*SKIP)(*FAIL)|(\s+)')

parts = rx.split(string)
print(parts)
# ['Hello', ' ', 'world', '\n', 'I', ' ', 'am', ' ', 'Lucas', ' ', '[help me]', '\n', 'Hi']

它匹配任何不需要的结构,例如[...],然后让它们失败。请参阅a demo on regex101.com