我需要处理一些有很多空格的文本,如下,
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]