[英]How to decide which whitespace to split by in regex?
我需要处理一些带有很多空格的文本,如下所示,
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))
output:
['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
您尝试的模式(.+?@.+?)
将匹配尽可能少的字符,直到遇到 @ 后它可以匹配单个字符,因为它不会贪婪地给您错误的 output。
您可以更具体地了解您允许匹配和使用替代的内容|
匹配方括号版本或初始 @ 后没有 @ 的版本。
它在@
之后至少匹配一个非空白字符,而不是只匹配k3@
[^\s@]+@(?:[^][\s@]+|\[[^][]*])
解释
[^\s@]+
匹配除@ 或空白字符之外的任何字符 1+ 次@
匹配@(?:
非捕获组匹配
[^][\s@]+
匹配除@ [ ] 或空白字符之外的任何字符|
或者\[[^][]*]
从[
到]
匹配)
关闭群组import re
regex = r"[^\s@]+@(?:[^][\s@]+|\[[^][]*])"
s = "k1@v1 k2@[v1 v2 v3] k3@v1"
matches = re.findall(regex, s)
print(matches)
Output
['k1@v1', 'k2@[v1 v2 v3]', 'k3@v1']
使用拆分,正则表达式只会破坏此类简单问题的性能。
txt = "welcome to the jungle"
x = txt.split(" ") #returns list without white spaces aka [welcome, to, the, jungle]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.