2017-03-05 67 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 ...这是常规练习 –