2017-08-18 30 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