如何决定在正则表达式中分割哪些空白?



我需要处理一些有很多空格的文本,如下,

string_many_whitespace = "k1@v1 k2@[v1 v2 v3] k3@v1">

import re
string_many_whitespace = "k1@v1 k2@[v1 v2 v3] k3@v1"
print(re.findall('(.+?@.+?)', string_many_whitespace))

输出:

['k1@v', '1 k2@[', 'v1 v2 v3] k3@v']

如你所见,它们被错误的空格分隔。

我想要的是:

['k1@v1', 'k2@[v1 v2 v3]', 'k3@v1']

编辑:有时条目是kUPPER@value,不总是小写或数字,例如

"k1@v1 k2@[v1 v2 v3] kUPPER@value">

我相信你需要:

re.compile("(?= [a-zA-Z]+d*@) ").split(string_many_whitespace)

您可以在这里看到它针对正确的空格:https://regex101.com/r/EPG1CI/1

您尝试的(.+?@.+?)模式将匹配尽可能少的字符,直到它在遇到@后可以匹配单个字符,因为它是非贪婪的,会给您错误的输出。


您可以在允许匹配的内容上更具体,并使用替代|来匹配方括号版本或初始@后没有@的版本。

@之后至少匹配一个非空白字符,而不是只匹配k3@

[^s@]+@(?:[^][s@]+|[[^][]*])

  • [^s@]+匹配1+倍除@或空白字符以外的任何字符
  • @匹配@
  • (?:不匹配捕获组
    • [^][s@]+匹配除@[]或空白字符以外的任何字符
    • |
  • [[^][]*][]匹配
  • )关闭组

Regex demo | Python demo

import re
regex = r"[^s@]+@(?:[^][s@]+|[[^][]*])"
s = "k1@v1 k2@[v1 v2 v3] k3@v1"
matches = re.findall(regex, s)
print(matches)

输出
['k1@v1', 'k2@[v1 v2 v3]', 'k3@v1']

使用split,对于这样简单的问题regex只会破坏性能。

txt = "welcome to the jungle"
x = txt.split(" ") #returns list without white spaces aka [welcome, to, the, jungle]

最新更新