2017-10-06 56 views
1

結束我有以下的輸入字符串提取URL的開始部分,如果它與.com或.net

string = ['sql ddlsql144.internal.ecnahcdroffilc.net', 
      'fra-sql-03.internal.ecnahcdroffilc.net bro', 
      'esc-cca3cdr-12.internal.ecnahcdroffilc.com', 
      'au-per-06a-stwp-01.per.asia.ecnahcdroffilc.com',\ 
      'http://go.fotrscomi.com', 
      'http //go.fotrscomi.com', 
      'fotrscomi.windows.computer', 
      'printers-03.internal.clif 10.51.59.10 roalswinds.oionr'] 

我想要的結果是

['ddlsql144', 
'fra-sql-03', 
'esc-cca3cdr-12', 
'au-per-06a-stwp-01' 
'10.51.59.10' ] 

條件匹配的模式是:

  • .com.net結尾的網址應該匹配,但它不應該與啓動或http://http //
  • 只有url的第一部分必須歸還
  • 如果有任何IP地址出現在字符串

我試圖

expression = "(\w[-.a-z0-9]*)..?(?=org|net|com)" 
# to extract the whole url 
urls = re.findall(expression, str(string)) 

獲取初始部分我用

re.findall('(^\w.+?)\.',str(urls)) 

但是這並沒有給我預期的結果。

+0

OP,我們需要談談那些空間存在。 –

+0

另外,你是100%使用正則表達式,或者你會考慮一個更有效的解決方案嗎? –

+0

條件已更新。 – ksai

回答

2

re.search功能和特定的正則表達式擴展的解決方案:

import re 

items = ['sql ddlsql144.internal.ecnahcdroffilc.net','fra-sql-03.internal.ecnahcdroffilc.net bro', 
      'esc-cca3cdr-12.internal.ecnahcdroffilc.com', 'au-per-06a-stwp-01.per.asia.ecnahcdroffilc.com', 
      'http://go.fotrscomi.com', 'http //go.fotrscomi.com', 
      'fotrscomi.windows.computer', 'printers-03.internal.clif 10.51.59.10 roalswinds.oionr' 
     ] 

result = [] 
pat = re.compile(r'(http)?([^\s.]+)[^\s]+\.(?:org|net|com)\b|\b((?:[0-9]{1,3}\.){3}[0-9]{1,3})\b') 
for i in items: 
    m = pat.search(i) 
    if m: 
     if not m.group(1) and m.group(2) and not m.group(2).startswith('http'): 
      result.append(m.group(2)) 
     elif m.group(3): 
      result.append(m.group(3)) 

print(result) 

輸出:

['ddlsql144', 'fra-sql-03', 'esc-cca3cdr-12', 'au-per-06a-stwp-01', '10.51.59.10'] 
+0

我對「10.51.59.10」的條件沒有作出道歉,但我也需要這種匹配。查看更新 – ksai

+0

@ksai,查看我的更新 – RomanPerekhrest

+0

當輸入是字符串而不是列表時,是否可以這樣做,比如'str(list)'' – ksai