Python Regex Scrape&Replace字符串

2024-09-24 22:30:34 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想用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>

它应该将每个表行的&nbsp;替换为每行第二个表数据字段中的;和)之间的卷。在

我开始像那样用python编写代码,我可以用regex语句来抓取卷,但我的逻辑是如何将值放在正确的位置上。有什么想法吗?这是我的密码

^{pr2}$

Tags: 工具代码l1助手语句trregextd
3条回答

如果暴力正则表达式是可接受的

s='''
<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>
'''

import re

p=r'(\([0-9x.]+)(; +)([0-9,m³]+)(\)</p></td>\n <td><p>)(&nbsp;)'

# not sure which output is preferred
x = re.sub(p, '\g<1>\g<2>\g<3>\g<4>\g<3>', s)
print(x)

y = re.sub(p, '\g<1>\g<4>\g<3>', s)
print(y)

NB:您不需要调用close(),因为with语句可以帮您完成。

{cd3>每个函数都可以使用

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;替换为

例如:

^{pr2}$

你会得到:

<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]

另一种方法。在

首先,找到所有的表单元格,以及其中的p元素。您知道p元素的特征是在它们的text中存在,所以请注意它们,并且您知道必须立即更改后面的p元素。然后安排在遇到该区域时捕获它,注意p元素的序号,然后当遇到下一个p元素时,通过将area分配给它的string属性来更改它的text。在

如果您更喜欢regex,那么可以使用它来计算area

area = bs4.re.search(r';\s+([^\)]+)', p.text).groups(0)[0]

一。在

^{pr2}$

相关问题 更多 >