2017-08-18 32 views
-3

我需要获取所有围绕它们的文本中有两个或更多空格“\ s {2,}”。给出了正则表达式的匹配词

鉴于以下文字:

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


我需要提取:

线路1:"IP Address", "Name", "Location", "Type"
线路2:"10.1.10.5", "USLAXBOWC01RB", "Santa Monica, CA", "local"

编辑:

文本获提取:

IP Address” &“Name”是开的两个或多个空间,使他们有资格被提取。类似地,“Santa Monica, CA”&“local”。

+0

什么问题?你是如何做到这一点? –

+0

什么正则表达式的味道?对你来说什么是对的?为什么第一行的“IP地址”中缺少空格? “第三线的”圣莫尼卡,加利福尼亚州“是一场包含逗号或单独比赛的单场比赛吗?为什么不使用固定宽度的文本解析器? – Aaron

+0

只需拆分2个或更多空格。 – Toto

回答

2

您尝试根据模式“\s{2,}”分割文本。

因此,在Python中,正则表达式的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]" 
  1. 它首先选择一个字符这是不符合[^\s](?!\s{2,})空间不是跟两个空格以上。为了做到这一点,我使用了负面视图断言(?!...);
  2. 然后,它将以这种方式组成的组(?:...)隔离出来:任何字符.其后面不是\s{2,};
  3. 重复*;
  4. 如果我们现在停下来的话,最终的角色不会被选中。所以我们应该再添加一个[^\s]

A re.findall(reg1,line),你应该完成。一个缺点可能是:它检测至少两个字符长的序列

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

顺便说一句,我强烈建议的文档的样子:https://docs.python.org/2/library/re.html

希望你发现你在找什么:-)

+0

所以不是他们的方式,我们可以为此写一个正则表达式吗? – codingkapoor

+0

@codingkapoor'\ s {2,}'是一个正则表达式。你是说你宁愿使用正则表达式来匹配而不愿意使用split? – Aaron

+0

@Aaron Scala有一个API,可以给我一个所有匹配的列表。所以我想如上面解释的那样编写一个正则表达式!它适合现有的逻辑。另外,我会学到新的东西! :) – codingkapoor