Skip to main content
 首页 » 编程设计

Python 正则表达式抓取和替换字符串

2025年05月04日38zhwl

你好,我想用 Python 编写一个小的辅助工具,它应该处理以下内容:

<tr> 
 <td><p>L1</p></td> 
 <td><p>(4.000x2.300x500;   4,6m³)</p></td> 
 <td><p>&nbsp;</p></td> 
 <td><p> 1.221 kg</p></td> 
 </tr> 
 <tr> 
 <td><p>L2</p></td> 
 <td><p>(4.250x2.300x500;   4,9m³)</p></td> 
 <td><p>&nbsp;</p></td> 
 <td><p> 1.279 kg</p></td> 
 </tr> 
 <tr> 
 <td><p>L3</p></td> 
 <td><p>(4.500x2.300x500;   5,2m³)</p></td> 
 <td><p>&nbsp;</p></td> 
 <td><p> 1.321 kg</p></td> 
 </tr> 
 <tr> 
 <td><p>L4</p></td> 
 <td><p>(4.750x2.300x500;   5,5m³)</p></td> 
 <td><p>&nbsp;</p></td> 
 <td><p> 1.364 kg</p></td> 
 </tr> 

在本例中,它应该将每个表行的   替换为 ;以及每行第二个表格数据字段中的 )。

我开始像那样用 python 编写代码,我已经可以用正则表达式语句抓取 Volume,但我的逻辑结束于如何将值放在正确的位置。任何想法 ?这是我的代码

import BeautifulSoup 
import re 
 
with open('3mmcontainer.html') as f: 
    content = f.read() 
f.close() 
 
#print content 
 
contentsoup = BeautifulSoup.BeautifulSoup(content) 
 
for tablerow in contentsoup.findAll('tr'): 
    inhalt = str(tablerow.contents[3]) 
    print inhalt 
 
 
    match = re.findall('\;(.*?)\)', inhalt) 
 
 
    print match 
# for x in match: 
#    volumen = x.lstrip() 
#    print volumen 
 
   #f = open('3mmcontainer.html', 'w') 
   #newdata = f.replace("&nbsp;", volumen) 
   #f.write(newdata) 
   #f.close() 
 
 
#m = re.search('\;(.*?)\)', inhalt) 
# print m 
 
# volumen = re.compile(r'\;(.*?)\)') 
# volumen.match(tablerow.contents[3]) 

请您参考如下方法:

注意:您不需要调用 close()因为with语句会为您完成。

您可以使用一个简单的函数来转换每一行 ( <tr/> ):

import re 
 
 
def parse_inhalt(content): 
    td_list = re.findall(r"<td>(?:(?!</td>).)+</td>", content) 
    vol_content = td_list[1] 
    vol = re.findall(r";([^)]+)", vol_content)[0] 
    return content.replace("&nbsp;", vol) 

代码很简单:

  • 提取 td_list 中的每个单元格
  • 获取包含体积的第二个单元格的内容
  • 找到包含在“;”之间的卷和“)”(不包括那些字符)
  • 替换 &nbsp;按量

例如:

inhalt = u"""\ 
<tr> 
<td><p>L4</p></td> 
<td><p>(4.750x2.300x500;   5,5m³)</p></td> 
<td><p>&nbsp;</p></td> 
<td><p> 1.364 kg</p></td> 
</tr>""" 
 
print(parse_inhalt(inhalt)) 

你得到:

<tr> 
<td><p>L4</p></td> 
<td><p>(4.750x2.300x500;   5,5m³)</p></td> 
<td><p>   5,5m³</p></td> 
<td><p> 1.364 kg</p></td> 
</tr> 

您可以使用以下方法删除空格:

vol = re.findall(r";\s*([^)]+)", vol_content)[0]