2017-03-05 94 views
1

我想解析Python中的正則表達式,並將解析的字符串的值分配給2個變量。如何將_sre.SRE_Match類型轉換爲字符串和整數

例如,如果我有一個字符串

<tr align="right"><td>1</td><td>Michael</td><td>Jessica</td> 

欲值1分配給整數變量被稱爲秩和值[邁克爾,傑西卡]到稱爲名稱的數組。

當我使用re.search()解析並使用.group()函數賦值時,分配的變量類型是_sre.SRE_Match。你能幫我關於如何將其分別轉換爲整數和字符串格式。

+0

'.group()'應該返回一個字符串。你能展示你使用的模式嗎? – falsetru

+0

這是我爲提取創建的函數: 'def extract_rankname(line): name = [] rank = re.search('(\ d)+',line) male_name = re.search('( \ d)+​​([\ W] +)」,線) female_name = re.search( '(\ d)+​​([\ W] +)​​([\ W] +)', line) name.append(male_name.group(2)) name.append(female_name.group(3)) rankname = {rank:name} 'return(rankname)' –

+1

謝謝..解決了這個問題。 –

回答

1

你可以試試這個:

<td>(\w+)<\/td> 

Demo

然後通過比賽迭代並分配給數組或變量...

示例代碼(Run it here):

import re  
regex = r"<td>(\w+)<\/td>"  
test_str = "<tr align=\"right\"><td>1</td><td>Michael</td><td>Jessica</td>" 
values=[] 
matches = re.finditer(regex, test_str)  
for match in matches: 
    if match.group(1).isdigit(): 
    rank = int(match.group(1)) 
    else: 
    values.append(match.group(1)) 

print(rank) 
print(values) 
+0

爲什麼downvote?想知道 –

+0

我認爲枚舉沒有做壞的世界!!!!,無論如何我已經刪除了枚舉......此外,因爲op沒有標記爲python 2。7因此,通過python標籤描述,這是可以的,如果我在python 3.x –

+0

回答是可以使用...編輯答案 –

3

以下行:

rank = re.search('(\d)+', line) 

應改爲:

rank = re.search(r'\d+', line).group() # (..) is not needed 

得到一個字符串。

如果你想int對象,使用int

rank = int(re.search(r'\d+', line).group()) 

BTW,使用re.findall,你的程序可以簡化。

import re 

def extract_rankname(line): 
    groups = re.findall('<td>(.*?)</td>', line) 
    try: 
     rank = groups[0] # int(groups[0]) 
     return {rank: groups[1:]} 
    except ValueError: 
     return {} # return None 

extract_rankname('<tr align="right"><td>1</td><td>Michael</td><td>Jessica</td>') 
# => {'1': ['Michael', 'Jessica']} 

或者,而不是使用正則表達式解析HTML時,最好使用庫像BeatufiulSoup,LXML。

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup('<tr align="right"><td>1</td><td>Michael</td><td>Jessica</td>', 'lxml') 
>>> [td.text for td in soup.find_all('td')] 
[u'1', u'Michael', u'Jessica'] 
>>> tds = [td.text for td in soup.find_all('td')] 
>>> tds[0], tds[1:] 
(u'1', [u'Michael', u'Jessica']) 
>>> print(tds[0]) # rank 
1 
>>> tds[1:] # names 
[u'Michael', u'Jessica'] 
+0

你的代碼不考慮排序...如果數量和名稱的順序是不同的順序,那麼它將失敗......並且操作員希望排名爲整數...你在回答中註釋掉了 –

+0

即使你把int(等級),那麼它會通過錯誤,如果沒有編號分配...和輸入如:extract_rankname(' mogu​​dfdf​​Michael​​Jessica')如果你投了int,那麼你在投出之前還應該檢查它是否是int ...這是常規練習 –