2017-07-11 91 views
0

我必須匹配下面的模式。如何在某些列爲空時匹配多列數據?

98.40.1.0/12  104.12.1.222       0 37430 9123 817 i 

       44.156.112.10   0    0 2224 6336 711 i 

       51.134.121.9       0 7456 8936 1222 900 i 

我寫了如下的表達式:

\s+(\S+)\s+(\S+)(?:\d+\s+|\s+)(?:\d+\s+|\s+)(.*) 

,但它並不適用於所有的三線工作,因爲二,三線有在第一列中的數據。

有人可以建議我一個解決方案嗎?

+0

那怎麼期待匹配 「列」 與正則表達式?您正在使用錯誤的工具。 –

+0

它不是一個專欄,我寫了專欄文字只是爲了區分我上面提到的模式。 它只是一個文本文件O/P,我需要解析。 –

+0

是的,我明白了。我的意思是,正則表達式不是解析器。您正在使用錯誤的工具。 –

回答

0

繼正則表達式的作品(在python測試):

((\d*\.\d*\.\d*\.\d*)([\/]\d*)?)(\s*\d*\.\d*\.\d*\.\d*)*((\s*\d*)*) 

此解決方案僅適用於假設:模式「98.40.1.0/12」將只在一開始,其他剩餘部分將是格局「104.12.1.222」

輸出 - 應該僅在位置1,4,和5使用匹配:

Match 1 
1. 98.40.1.0/12 
2. 98.40.1.0 
3. /12 
4. 104.12.1.222 
5. 0 37430 9123 817 
6. Empty 

Match 2 
1. 44.156.112.10 
2. 44.156.112.10 
3. None 
4. None 
5. 0 0 2224 6336 711 
6. Empty 

Match 3 
1. 51.134.121.9 
2. 51.134.121.9 
3. None 
4. None 
5. 0 7456 8936 1222 900 
6. Empty 
+0

其實我想要的是: 1場 1. 98.40.1.0/12 2. 3. 4. 104.12.1.222 5 37430 9123 817 i 6. 第2場 1. 2. 44.156.112.10 3。 4. 5. 2224 6336 711 i 6. 同樣,匹配3. –

+0

表示要從位置5的匹配中刪除「0」。是否正確? –

+0

是的,想刪除0,對於比賽2和3我不應該得到任何東西在1. –

0

這是一個很好的方法:

  • 要使用捕獲組捕獲您想要的內容,並且要在這些組之間設置「省略」部分 。
  • 如果出現同樣的模式多次,則:
    • 定義命名模式一次
    • 稱之爲多次。

嘗試的解決方案符合上述規則(可讀性我分裂它 成2行):

(?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+)) 
^((?&IP)\/\d+)?\s+((?&IP))(?:\s+0)+ ((?:\d+)+\d+) 

帶有選項g全球)和m多行)。

各個部件的描述:

  • (?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+)) - 定義名爲捕獲 組(組#1,名稱IP)。這裏只是一個定義,這個 組(迄今爲止)不捕獲任何東西。
  • ^ - 開始一行(不是整個字符串,由於m選項)。
  • ((?&IP)\/\d+)? - 捕獲組#2,其中包括:
    • 「呼叫」 IP組,
    • 斜線和數字序列,
    • 所有這可選的(?末)。
  • \s+ - 一系列空格。
  • ((?&IP)) - 捕獲組#3 - 另一個「致電」IP組。
  • (?:\s+0)+ - 非捕獲組 - 空格和0,重複 幾次。
  • - 最後一個0後的空格跳過。
  • ((?:\d+)+\d+) - 捕獲組#4,其中包括:
    • 的數字序列和一個空間,反覆數次,
    • 的數字的最後一個序列。

此正則表達式捕獲:

  • 從行1:
    • 98.40.1.0/12 - 組2,
    • 104.12.1.222 - 組3,
    • 37430 9123 817 - 基團4.
  • 第2行:
    • 2組打着什麼,
    • 44.156.112.10 - 3組,
    • 2224 6336 711 - 第4組。
  • 從3行:
    • 組2什麼都沒抓到,
    • 51.134.121.9 - 組3,
    • 7456 8936 1222 900 - 第4組。
相關問題