当前位置: 首页 > 面试题库 >

用Python抓取一行的空白/缩进

毛宏达
2023-03-14
问题内容

基本上,如果我有一排以缩进开头的文本,那么获取该缩进并将其放入Python变量中的最佳方法是什么?例如,如果该行是:

\t\tthis line has two tabs of indention

然后它将返回“ \ t \ t”。或者,如果该行是:

    this line has four spaces of indention

然后它将返回四个空格。

因此,我想您可能会说,我只需要从字符串中去除所有内容,从第一个非空白字符到末尾。有什么想法吗?


问题答案:
import re
s = "\t\tthis line has two tabs of indention"
re.match(r"\s*", s).group()
// "\t\t"
s = "    this line has four spaces of indention"
re.match(r"\s*", s).group()
// "    "

要删除前导空格,请使用lstrip。

由于反对票可能会质疑正则表达式的效率,因此我进行了一些分析以检查每种情况的效率。

字符串很长,引导空间很短

正则表达式> Itertools >> lstrip

>>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*")s="          hello world!"*10000', number=100000)
0.10037684440612793
>>> timeit.timeit('"".join(itertools.takewhile(lambda x:x.isspace(),s))', 'import itertools;s="          hello world!"*10000', number=100000)
0.7092740535736084
>>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s="          hello world!"*10000', number=100000)
0.51730513572692871
>>> timeit.timeit('s[:-len(s.lstrip())]', 's="          hello world!"*10000', number=100000)
2.6478431224822998

字符串很短,前导空间很短

lstrip> RegEx> Itertools

如果您可以将字符串的长度限制为不超过千个字符,则lstrip技巧可能会更好。

>>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s="          hello world!"*100', number=100000)
0.099548101425170898
>>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s="          hello world!"*100', number=100000)
0.53602385520935059
>>> timeit.timeit('s[:-len(s.lstrip())]', 's="          hello world!"*100', number=100000)
0.064291000366210938

这显示lstrip技巧的缩放比例大致为O(√n),并且如果前导空格的数量不是很多,则RegEx和itertool方法为O(1)。

字符串很短,前导空间很长

lstrip >> RegEx >>> Itertools

如果前导空格很多,请不要使用RegEx。

>>> timeit.timeit('s[:-len(s.lstrip())]', 's=" "*2000', number=10000)
0.047424077987670898
>>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s=" "*2000', number=10000)
0.2433168888092041
>>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" "*2000', number=10000)
3.9949162006378174

字符串很长,引导空间很长

lstrip >>> RegEx >>>>>>>> Itertools

>>> timeit.timeit('s[:-len(s.lstrip())]', 's=" "*200000', number=10000)
4.2374031543731689
>>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s=" "*200000', number=10000)
23.877214908599854
>>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" "*200000', number=100)*100
415.72158336639404

如果非空间部分不是很多,这表明所有方法的缩放比例大致为O(m)。



 类似资料:
  • 1. 缩进和空白 我们知道C语言的语法对缩进和空白没有要求,空格、Tab、换行都可以随意写,实现同样功能的代码可以写得很好看,也可以写得很难看。例如上一章例 8.5 “剪刀石头布”的代码如果写成这样就很难看了: 例 9.1. 缺少缩进和空白的代码 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { ch

  • 问题内容: 我想从网站上获取每天的日出/日落时间。是否可以使用Python抓取网络内容?使用什么模块?有没有可用的教程? 问题答案: 结合使用urllib2和出色的BeautifulSoup库:

  • 本文向大家介绍Python使用Scrapy框架进行抓取,包括了Python使用Scrapy框架进行抓取的使用技巧和注意事项,需要的朋友参考一下 示例 首先,您必须建立一个新的Scrapy项目。输入要存储代码并运行的目录: 要刮擦,我们需要一只蜘蛛。蜘蛛定义了如何刮除某个站点。以下是蜘蛛的代码,该代码遵循指向StackOverflow上投票最高的问题的链接,并从每个页面中抓取一些数据(源): 将您的

  • 问题内容: 我正在使用python csv阅读器。我如何以忽略空白行的方式使用以下代码。 问题答案: 如果您的csv文件以空行开头,我认为您应该能够在创建csv阅读器之前跳过该行:

  • 我试图从html文件中获取内容,该文件位于html中。gz文件。当我尝试使用Jsoup点击URL时,我得到: 线程“main”til.readEOFException中的异常:til.java:154InflaterInputSorg.jsoup.helper.(InflaterInputSesponse.execute)onnection.java:560InflaterInputSorg.js

  • 本文向大家介绍利用Python抓取行政区划码的方法,包括了利用Python抓取行政区划码的方法的使用技巧和注意事项,需要的朋友参考一下 前言 国家统计局网站上有相对比较齐的行政区划码,对于一些网站来说这是非常基础的数据,所以写了个Python程序将这部分数据抓取下来。 注意:抓取下来以后还要进行简单的人工的整理 示例代码: 注意事项: 另外,关于国家地区表的信息,还有另外一种获取渠道,那就是QQ软