繁体   English   中英

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

[英]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@]+匹配除@ [ ] 或空白字符之外的任何字符
    • | 或者
  • \[[^][]*][]匹配
  • )关闭群组

正则表达式演示| Python 演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM