2017-07-06 26 views
0

我有一個字符串什麼正則表達式可以提取我需要的數據?

url = '//item.taobao.com/item.htm?id\u003d528341191030\u0026ns\u003d1\u0026abbucket\u003d0#detail' 

我喜歡以提取前兩個\u之間的數528341191030。我試過這個,

m = re.search('\?id\u\d+d(\d+?)\u', url) 
if m: 
    print m.group(1) 

但它不起作用。我的解決方案有什麼問題?

+0

你能告訴我們的產量是什麼,這是否是一個錯誤或不正確的輸出 –

+0

由於搜索返回None,所以它不會輸出任何東西。沒有任何錯誤。 – dullboy

回答

4

你確定你需要的正則表達式? 下面是使用split一個解決方案:

url.split("\u")[1].split("d")[-1] 
'528341191030' 

在有什麼不對您正則表達式而言,「\」是一個特殊字符,所以你應該使用「\\」的反斜槓(所以「\\\ū 「而不是 」\ U「):

m = re.search('\?id\\\u\d+d(\d+?)\\\u', url) 
if m: 
    print m.group(1) 

給出:528341191030

Docs

註冊ular表達式用反斜槓字符(「\」)來表示 特殊格式或允許在不調用 其特殊的意義要使用特殊字符。這與碰撞的 相同的字符在字符串文字相同的目的Python的使用;對於 的示例,要匹配文字反斜槓,可能必須將'\\' 作爲模式字符串,因爲正則表達式必須是\,並且 每個反斜槓必須在常規Python字符串 之內表示爲\。

或者,使用Raw String Notation

m = re.search(r"\?id\\u\d+d(\d+?)\\u", url) 
if m: 
    print m.group(1) 
+0

@yi xiao:感謝原始字符串符號的編輯:) – FLab

+0

其實我試圖逃避'\'這樣, url ='//item.taobao.com/item.htm?id\u003d528341191030\u0026ns\u003d1 ('\?id \\ u \ d + d(\ d +?)\\ u',url) if m: print m.group(1) 但它仍然不起作用 – dullboy

+0

你應該在「u」之前加3「\」。請嘗試複製代碼示例並讓我知道 – FLab

0

嗯,你總是可以試試這個(不是超級優雅,但工程):

first = url.find('\u') + 2 
prev = 'u' 
m = "" 
for i in range(first, len(url)): 
    if prev == '\' and url[i] == 'u': 
     break 
    else: 
     m += url[i] 
    if url[i] == 'd': 
     m = "" 
0

更好的辦法是的parseURL並得到查詢串值

url = '//item.taobao.com/item.htm?id\u003d528341191030\u0026ns\u003d1\u0026abbucket\u003d0#detail' 
import urllib.parse as urlparse 
print (urlparse.parse_qs(urlparse.urlparse(url).query)) 
print (urlparse.parse_qs(urlparse.urlparse(url).query)['id']) 

輸出:

{'id': ['528341191030'], 'ns': ['1'], 'abbucket': ['0']} 
['528341191030']