使用 Python 标准化空格

问题描述 投票:0回答:4

我正在使用 scrapy 构建数据提取,并希望规范化从 HTML 文档中提取的原始字符串。这是一个示例字符串:

  Sapphire RX460 OC  2/4GB

注意字符串文字前面以及

OC
2
之间的两组空格,每组两个空格。

Python 提供了修剪,如如何使用 Python 修剪空白?但这无法处理

OC
2
之间的两个空格,我需要将其折叠成一个空格。

我尝试使用 XPath 中的

normalize-space()
,同时使用我的 scrapy Selector 提取数据,这有效,但赋值冗长且具有强烈的向右漂移:

product_title = product.css('h3').xpath('normalize-space((text()))').extract_first()

有没有一种优雅的方式使用Python来标准化空格?如果不是一行,有没有一种方法可以将上面的行分解成更容易阅读的内容,而不会引发缩进错误,例如

product_title = product.css('h3')
    .xpath('normalize-space((text()))')
    .extract_first()
python string xpath scrapy
4个回答
36
投票

您可以使用:

" ".join(s.split())

其中

s
是你的字符串。


4
投票

与其使用正则表达式,更有效的解决方案是使用连接/拆分选项,观察:

>>> timeit.Timer((lambda:' '.join(' Sapphire RX460 OC  2/4GB'.split()))).timeit()
0.7263979911804199

>>> def f():
        return re.sub(" +", ' ', "  Sapphire RX460 OC  2/4GB").split()

>>> timeit.Timer(f).timeit()
4.163465976715088

0
投票

您可以使用如下函数和正则表达式来扫描连续空格并将其替换为 1 个空格

import re

def clean_data(data):
    return re.sub(" {2,}", " ", data.strip())

product_title = clean(product.css('h3::text').extract_first())

然后按照你喜欢的方式改进清洁功能


0
投票

接受的答案是标准化空白的正确方法。这是关于格式化的第二个问题的答案。

您还询问了如何跨多行格式化 Python 代码而不引发缩进错误。您可以在 Python 中使用括号来做到这一点。以下是您的问题中的示例代码,为了便于阅读,将其格式化为多行。

product_title = (
    product.css("h3")
    .xpath("normalize-space((text()))")
    .extract_first()
)

请注意,这些括号不会创建元组,因为没有逗号。外括号仅用于格式化目的。

上面的多行代码完全相当于将所有方法调用链接在一行上。

product_title = product.css("h3").xpath("normalize-space((text()))").extract_first()
© www.soinside.com 2019 - 2024. All rights reserved.