匹配已给出regex的单词

匹配已给出regex的单词,regex,scala,Regex,Scala,我需要获取所有文本,这些文本周围有两个或两个以上的空格“\s{2,}” 鉴于以下案文: IP Address Name Location Type 10.1.10.5 USLAXBOWC01RB Santa Monica, CA local 我需要摘录: 第1行:“IP地址”、“名称”、“位置”、“类型” 第2行:“10.1.10.5”、“USLAXBOWC01RB”、“加利福尼亚州圣莫尼卡”、“本地” 编辑: 符合提取条件的文本: “IP地址

我需要获取所有文本,这些文本周围有两个或两个以上的空格“\s{2,}”

鉴于以下案文:

IP Address  Name           Location          Type
10.1.10.5   USLAXBOWC01RB  Santa Monica, CA  local

我需要摘录:

第1行:
“IP地址”、“名称”、“位置”、“类型”

第2行:
“10.1.10.5”、“USLAXBOWC01RB”、“加利福尼亚州圣莫尼卡”、“本地”

编辑:

符合提取条件的文本:


IP地址
”&“
名称
”是两个或两个以上的空格,因此它们有资格被提取。类似地,“
Santa Monica,CA
”&“
local

您尝试按照模式“
\s{2,}
”分割文本

因此,在Python中,regex lib
re
为您提供了所有需要的工具:

import re
line   = "IP Address  Name           Location          Type"

result = re.split('\s{2,}',line)
其中:

['IP Address', 'Name', 'Location', 'Type']
编辑

我想我更理解你的问题:你更关心在
\s{2,}
之间隔离一个序列,而不是拆分它。然而,在您的示例中,上面的解决方案似乎是最合适的

你要的是正则表达式,在这里:

reg1 = "[^\s](?!\s{2,})(?:.(?!\s{2,}))*[^\s]"
  • 它首先选择一个字符,该字符不是后跟两个或多个空格的
    [^\s](?!\s{2,})
    空格。为此,我使用了否定的前瞻断言
    (?!…)
  • 然后,它分离出一个组
    (?:…)
    ,该组由以下方式组成:任何字符
    ,后面不跟
    \s{2,}
  • 重复使用
    *
  • 如果我们现在停止,最后一个角色就不会被选中。因此,我们应该再添加一个
    [^\s]
  • 一个
    re.findall(reg1,line)
    ,你应该这样做。可能有一个缺点:它检测的序列至少有两个字符长

    在这种情况下,另一个更简单的正则表达式最终可以完成作业:
    reg2=“\s{2,}([^\s])\s{2,}”
    。它选择由两个或多个空格包围的单个非空格字符。使用括号
    (…)
    ,强制只返回字符

    顺便说一下,我强烈建议您查看一下文档:


    希望您找到您要找的东西:-)

    有什么问题吗?你到底是怎么做到的?什么regex口味?对你有什么意义?为什么第一行的“IP地址”中缺少空格?第三行的“加州圣莫尼卡”是包含逗号的单个匹配,还是两个单独的匹配?为什么不使用固定宽度的文本分析器?只需在2个或更多空格上拆分即可。@Aaron edited。。让我知道,如果这解释!您使用的是什么语言/工具?那么我们是否有办法为此编写正则表达式?@codingkapoor
    \s{2,}
    是一个正则表达式。你的意思是你宁愿使用正则表达式来
    匹配
    也不愿
    拆分
    ?@Aaron Scala有一个API,可以给我一个所有匹配项的列表。所以我想到了如上所述编写一个正则表达式!它将符合现有的逻辑。而且,我会学到一些新东西!:)@codingkapoor,但它也有一个API,可以通过正则表达式模式拆分字符串,good'ol
    String.spilt(String pattern)
    ,这将是解决正则表达式问题的最有效方法(请注意,不使用正则表达式可能更有效)。正则表达式在这里扮演的重要角色是描述两个或更多空间的序列;您可以在拆分时将此定义用作分隔符,或者您可以费心描述这些定义和匹配/查找,但这不会很好地使用regex(这仍然可以根据现有代码很好地利用时间)没有看到Scala在之后添加过;然而,从Python到Scala的转换可能不是问题