0

我想根据正确的字符串获得一个特定的数字。

这段字符串在 body2.txt

string = "<li>3 <span class='text-info'>quartos</span></li><li>1 <span class='text-info'>suíte</span></li><li>96<span class='text-info'>Área Útil (m²)</span></li>"

with open("body2.txt", 'r') as f:
  area = re.compile(r'</span></li><li>(\d+)<span class="text-info">Área Útil')
  area = area.findall(f.read())
  print(area)

输出:[] 预期输出:96

4

2 回答 2

0

您的报价不匹配。'text-info'仔细注意示例字符串和"text-info"编译的正则表达式之间的区别。IIRC 在原始字符串中转义引号在 Python 中有点痛苦(如果可能的话?),但字符串连接可以轻松地回避这个问题。

area = re.compile(r'</span></li><li>(\d+)<span class='"'"'text-info'"'"'>Área Útil')

关注引号,这是连接字符串'...class', "'", 'text-info', "'", 和'>.... 那里的规则是,如果您想'在单引号原始字符串中添加单引号,则改为编写'"'"'并尝试忽略图灵在他的坟墓中转身。我没有测试过性能,但我认为它的行为可能很像'...class' + "'" + 'text-info' + "'" + '>.... 如果是这种情况,则会在幕后发生大量复制,并且该策略在连接的片段数量上具有二次运行时间(假设它们的大小大致相同,否则通常适合这种分析)。使用几乎任何其他策略(例如''.join(...)或使用三引号原始字符串)都会更好r'''...''')。不过,这可能不是问题。在搞乱替代方案之前,对您的解决方案进行基准测试,看看它是否足够好。

正如提到的评论之一,您可能希望使用比正则表达式更强大的东西来解析 HTML。正则表达式无法正确解析任意HTML,因为它无法解析任意嵌套结构。有很多库可以使工作更轻松,并为您处理所有括号匹配和字符串处理,以便您可以专注于对所需数据的高级描述。我是lxml. 如果不花大量时间,类似下面的内容将大致相当于您正在做的事情。

from lxml import html

with open("body2.txt", 'r') as f:
    tree = html.fromstring(f.read())
area = tree.xpath("//li[contains(span/text(), 'Área Útil')]/text()")
print(area)

html.fromstring()方法将您的数据解析为 html。该tree.xpath方法使用xpath语法来查询该解析树。粗略地说,它的意思如下:

  1. //在树下任意远
  2. li一个列表节点
  3. [*]满足方括号中的任何属性
  4. contains(span/text(), 'Área Útil')li节点需要有一个span/text()包含文本的节点'Área Útil'
  5. /text()li我们想要任何作为我们正在描述的根的直接子级的文本。

我在这里处理少量的文本,一般情况下不知道您的文档结构是什么。您可以添加或更改任何这些属性,以更好地描述您正在解析的确切文档。当你检查一个元素时,任何现代浏览器都能够生成一个像样的 xpath 表达式来准确地挑选出你正在检查的元素。假设这个片段来自一个更大的文档,我想这个功能会为你节省时间。

于 2019-07-26T23:39:31.750 回答
0

无论目标处于何种/何种形式,这都会获得正确
的数字。捕获组 1 包含数字。

r"(\d*)\s*<span(?=\s)(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?\sclass\s*=\s*(?:(['\"])\s*text-info\s*\2))\s+(?=((?:\"[\S\s]*?\"|'[\S\s]*?'|[^>]?)+>))\3\s*Área\s+Útil"

https://regex101.com/r/pMATkj/1

于 2019-07-27T01:37:31.220 回答