2015-11-13 81 views
0

我已經撿了如何從以下字符串獲得2個整數我的大腦:轉義字符正則表達式

:{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a 

我可以寫正則表達式的罰款,但它的逸出,這造成了一些麻煩。

什麼角色,我需要逃跑得到這個與re.match

例如工作,我該如何放置"在以下幾點:

re.match("actor_id\\") 

我已經試過\\\\""無濟於事。

這是一個JSON字符串,但在這種情況下,JSON解碼不是一個選項,因爲它在源代碼中很深,不易通過遍歷DOM訪問。所以我堅持與正則表達式。

回答

1

你可能想看看在re.match的文件,因爲它指出:

如果在字符串開頭的零個或多個字符匹配正則表達式

注意:開始。

你可以改爲使用`re.findall'來標記每個鍵到它們的int。 IE:

>>> s = ':{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a' 
>>> re.findall('"([^"]+)":(\d+)',s) 
[('page_type', '16'), ('actor_id', '100010050258799'), ('story_id', '166366493708358')] 
>>> 
>>> d = dict(re.findall('"([^"]+)":(\d+)',s)) 
>>> d 
{'actor_id': '100010050258799', 'page_type': '16', 'story_id': '166366493708358'} 

注意模式:

"([^"]+)":(\d+) 
" #matches `"` char 
([^"]+) #matches anything EXCEPT `"` char, and captures in a group 
     ": #matches `":` chars 
      (\d+) #matches 1 or more digits and captures in a group 
0

這個沒什麼特別的。

>>> import re 
>>> x = ':{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a' 
>>> re.search(
     '\\"page_type\\":([0-9]+),' 
     '\\"actor_id\\":([0-9]+)', 
     x 
    ).groups() 
('16', '100010050258799') 

我更感興趣的是爲什麼JSON解碼不是您的選擇?你是否得到一個特殊的例外,或者這是一些psuedo-JSON格式?

1

你可以簡單地把一切非數字相同:

re.match(r'[^\d]+\d+[^\d]+(\d+)[^\d]+(\d+)', thestring) 

此相匹配,但沒有捕捉到第一個數字(16),然後 抓住了另外兩個。如果你需要更具體的話,插入諸如actor_id 的東西很容易。

0

爲什麼不使用',而不是"。如果您使用單引號,則不必轉義雙引號字符。這對我有用:

s = ":{\"page_type\":16,\"actor_id\":100010050258799,\"story_id" 
m = re.search('actor_id":(\\d+),',s) 
print(m.group(1))