strutils -文本操作

如此多的实际编程都涉及字符串操作,而这正是Python所能适应的。尽管如此,标准库中仍然缺少数十个基本和常见的功能,其中几个功能是由 strutils

class boltons.strutils.MultiReplace(sub_map, **kwargs)[源代码]

多重替换是一次执行多个查找/替换操作的工具。

在给定要替换的值的映射的情况下,它允许在单个过程中替换所有匹配值,这可以在非常大的字符串上节省大量性能。除了简单的替换,它还允许基于正则表达式进行替换。

关键字参数:

参数:
  • regex (bool) -- 将搜索关键字视为正则表达式 [Default: False]

  • flags (int) -- 编译期间要传递给正则表达式引擎的标志

词典用法::

from boltons import stringutils
s = stringutils.MultiReplace({
    'foo': 'zoo',
    'cat': 'hat',
    'bat': 'kraken'
})
new = s.sub('The foo bar cat ate a bat')
new == 'The zoo bar hat ate a kraken'

可重复使用::

from boltons import stringutils
s = stringutils.MultiReplace([
    ('foo', 'zoo'),
    ('cat', 'hat'),
    ('bat', 'kraken)'
])
new = s.sub('The foo bar cat ate a bat')
new == 'The zoo bar hat ate a kraken'

可以向构造函数传递字典或其他映射以及可迭代的元组。如果给定了一个可迭代变量,则将按照可迭代变量中指定的替换值的顺序运行替换。如果给它一个OrderedDict,这也是正确的。如果给定词典,则顺序将是不确定的::

>>> 'foo bar baz'.replace('foo', 'baz').replace('baz', 'bar')
'bar bar bar'
>>> m = MultiReplace({'foo': 'baz', 'baz': 'bar'})
>>> m.sub('foo bar baz')
'baz bar bar'

这是因为,如果您要插入的内容可能会被以后的替换所替换,则替换的顺序可能很重要。请注意,如果您需要依赖顺序,那么可以考虑使用元组列表而不是字典。

sub(text)[源代码]

对输入文本运行替换。

给定一个输入字符串,运行构造函数中给出的所有替换。

boltons.strutils.a10n(string)[源代码]

那个“国际化”变成“I18N”的东西叫什么来着?缩写?哦,等等,不: a10n 。(它实际上是一种 numeronym 。)

>>> a10n('abbreviation')
'a10n'
>>> a10n('internationalization')
'i18n'
>>> a10n('')
''
boltons.strutils.args2cmd(args, sep=' ')[源代码]

返回Shell转义的字符串版本 args ,由 sep ,使用与Microsoft C运行时相同的规则。

>>> print(args2cmd(['aa', '[bb]', "cc'cc", 'dd"dd']))
aa [bb] cc'cc dd\"dd

正如您所看到的,转义是通过反斜杠而不是引号进行的,并且双引号是唯一的特殊字符。有关更多详细信息,请参阅代码中的注释。基于来自 subprocess 模块。

boltons.strutils.args2sh(args, sep=' ')[源代码]

返回Shell转义的字符串版本 args ,由 sep ,基于Linux/BSD/MacOS生态系统中的sh、bash和其他Shell的规则。

>>> print(args2sh(['aa', '[bb]', "cc'cc", 'dd"dd']))
aa '[bb]' 'cc'"'"'cc' 'dd"dd'

如您所见,不带特殊字符的参数不会转义,带特殊字符的参数用单引号引起来,单引号本身用双引号引起来。双引号的处理方式与任何其他特殊字符一样。

基于来自 pipes/shlex 模块。另请注意, shlexargparse 具有拆分和分析以这种方式转义的字符串的函数。

boltons.strutils.asciify(text, ignore=False)[源代码]

转换Unicode或字节字符串, text 转换为只包含ASCII字符的字节串。为你们这些亲欧洲的人做基本的脱音。

另外,温和地提醒一下,这是一个 utility ,主要用于粘合。只要有可能,就让您的应用程序工作 with Unicode,不是反对它。

参数:
  • text (str) -- 要归类的字符串。

  • ignore (bool) -- 将最终编码配置为忽略剩余的未归类字符串,而不是替换它。

>>> asciify('Beyoncé') == b'Beyonce'
True
boltons.strutils.bytes2human(nbytes, ndigits=0)[源代码]

将一个整数值变为 nbytes 转换成人类可读的格式。集 ndigits 控制小数点后应显示的位数(默认 0 )。

>>> bytes2human(128991)
'126K'
>>> bytes2human(100001221)
'95M'
>>> bytes2human(0, 2)
'0.00B'
boltons.strutils.camel2under(camel_string)[源代码]

将驼峰大小写字符串转换为下划线。对于将类名转换为函数名很有用。

>>> camel2under('BasicParseTest')
'basic_parse_test'
boltons.strutils.cardinalize(unit_noun, count)[源代码]

单数词有条件复数形式 unit_noun 如果 count 不是一个,尽可能地保留大小写。

>>> vowels = 'aeiou'
>>> print(len(vowels), cardinalize('vowel', len(vowels)))
5 vowels
>>> print(3, cardinalize('Wish', 3))
3 Wishes
boltons.strutils.complement_int_list(range_string, range_start=0, range_end=None, delim=',', range_delim='-')[源代码]

返回范围字符串,该字符串是作为 range_string 参数。

这些范围字符串是由 format_int_list() ,并且可由 parse_int_list()

参数:
  • range_string (str) -- 逗号分隔的正整数或范围的字符串(例如‘1,2,4-6,8’)。打印机对话框中使用的自定义页面范围字符串的典型特征。

  • range_start (int) -- 一个正整数,结果范围从它开始。价值是包容的。默认为 0

  • range_end (int) -- 一个正整数,产生的范围从该正整数开始停止。价值是排他性的。默认设置为在提供的 range_string

  • delim (char) -- 默认为‘,’。分隔整数和连续的整数范围。

  • range_delim (char) -- 默认为‘-’。指示整数的连续范围。

>>> complement_int_list('1,3,5-8,10-11,15')
'0,2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_start=0)
'0,2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_start=1)
'2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_start=2)
'2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_start=3)
'4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=15)
'0,2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=14)
'0,2,4,9,12-13'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=13)
'0,2,4,9,12'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=20)
'0,2,4,9,12-14,16-19'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=0)
''
>>> complement_int_list('1,3,5-8,10-11,15', range_start=-1)
'0,2,4,9,12-14'
>>> complement_int_list('1,3,5-8,10-11,15', range_end=-1)
''
>>> complement_int_list('1,3,5-8', range_start=1, range_end=1)
''
>>> complement_int_list('1,3,5-8', range_start=2, range_end=2)
''
>>> complement_int_list('1,3,5-8', range_start=2, range_end=3)
'2'
>>> complement_int_list('1,3,5-8', range_start=-10, range_end=-5)
''
>>> complement_int_list('1,3,5-8', range_start=20, range_end=10)
''
>>> complement_int_list('')
''
boltons.strutils.escape_shell_args(args, sep=' ', style=None)[源代码]

中每个字符串的转义版本 args ,根据 style

参数:
  • args (list) -- 用于转义和联接在一起的参数列表

  • sep (str) -- 用于联接转义参数的分隔符。

  • style (str) -- 从逃逸到使用的风格。可以是以下之一 cmdsh ,分别面向Windows和Linux/BSD/等。如果 styleNone ,然后根据系统平台进行挑选。

看见 args2cmd()args2sh() 查看每种样式的详细信息和示例输出。

boltons.strutils.find_hashtags(string)[源代码]

查找并返回字符串中的所有哈希标签,但删除了哈希标记。支持亚洲语言的全角哈希标记,并且在URL锚点上不会出现误报。

>>> find_hashtags('#atag http://asite/#ananchor')
['atag']

find_hashtags 也可以与Unicode标签一起使用。

boltons.strutils.format_int_list(int_list, delim=',', range_delim='-', delim_space=False)[源代码]

返回正整数列表中已排序的范围字符串( int_list )。整数的连续范围折叠为最小值和最大值。反转 parse_int_list()

参数:
  • int_list (list) -- 要转换为范围字符串的正整数列表(例如 [1,2,4,5,6,8] )。

  • delim (char) -- 默认为‘,’。分隔整数和连续的整数范围。

  • range_delim (char) -- 默认为‘-’。指示整数的连续范围。

  • delim_space (bool) -- 默认为 False 。如果 True ,毕竟增加了一个空格 delim 人物。

>>> format_int_list([1,3,5,6,7,8,10,11,15])
'1,3,5-8,10-11,15'
boltons.strutils.gunzip_bytes(bytestring)[源代码]

这个 gzip 如果你有一个文件或类似文件的对象,模块是很棒的,但如果你只有字节又会怎样呢?StringIO是一种可能性,但只使用这一行代码通常更快、更容易、更简单。使用这个久经考验的实用函数从字节中解压缩gzip。

>>> gunzip_bytes(_EMPTY_GZIP_BYTES) == b''
True
>>> gunzip_bytes(_NON_EMPTY_GZIP_BYTES).rstrip() == b'bytesahoy!'
True
boltons.strutils.gzip_bytes(bytestring, level=6)[源代码]

将一些字节转换为一些压缩字节。

>>> len(gzip_bytes(b'a' * 10000))
46
参数:
  • bytestring (bytes) -- 要压缩的字节数

  • level (int) -- 一个整数,1-9,控制速度/压缩。1表示最快,压缩程度最低,9表示最慢,但压缩程度最高。

请注意,现在所有级别的gzip都相当快,尽管它在任何级别的压缩方面都不是真正的竞争对手。

boltons.strutils.html2text(html)[源代码]

从HTML文本中剥离标签,返回无标记文本。此外,还会尽最大努力替换“ ”等实体

>>> r = html2text(u'<a href="#">Test &amp;<em>(Δ&#x03b7;&#956;&#x03CE;)</em></a>')
>>> r == u'Test &(Δημώ)'
True
boltons.strutils.indent(text, margin, newline='\n', key=<class 'bool'>)[源代码]

缺少内置的对应部件 textwrap.dedent()

参数:
  • text (str) -- 要缩进的文本。

  • margin (str) -- 要添加到每行前面的字符串。

  • newline (str) -- 用于重新连接各行的换行符(默认为: \n )

  • key (callable) -- 调用每一行以确定是否缩进它。默认: bool 以确保空行不会添加空格。

boltons.strutils.int_ranges_from_int_list(range_string, delim=',', range_delim='-')[源代码]

变换一串范围( range_string )转换为元组的元组。

参数:
  • range_string (str) -- 逗号分隔的正整数或范围的字符串(例如‘1,2,4-6,8’)。打印机对话框中使用的自定义页面范围字符串的典型特征。

  • delim (char) -- 默认为‘,’。分隔整数和连续的整数范围。

  • range_delim (char) -- 默认为‘-’。指示整数的连续范围。

>>> int_ranges_from_int_list('1,3,5-8,10-11,15')
((1, 1), (3, 3), (5, 8), (10, 11), (15, 15))
>>> int_ranges_from_int_list('1')
((1, 1),)
>>> int_ranges_from_int_list('')
()
boltons.strutils.is_ascii(text)[源代码]

检查字符串或字节串, text ,仅由ASCII字符组成。加薪 ValueError 如果参数不是文本。

参数:

text (str) -- 要检查的字符串。

>>> is_ascii('Beyoncé')
False
>>> is_ascii('Beyonce')
True
boltons.strutils.is_uuid(obj, version=4)[源代码]

检查参数是否为有效的UUID对象或字符串。

参数:
  • obj (object) -- 测试目标。支持字符串和UUID对象。

  • version (int) -- 目标UUID版本,设置为0可跳过版本检查。

>>> is_uuid('e682ccca-5a4c-4ef2-9711-73f9ad1e15ea')
True
>>> is_uuid('0221f0d9-d4b9-11e5-a478-10ddb1c2feb9')
False
>>> is_uuid('0221f0d9-d4b9-11e5-a478-10ddb1c2feb9', version=1)
True
boltons.strutils.iter_splitlines(text)[源代码]

喜欢 str.splitlines() ,但返回行的迭代器而不是列表。也类似于 file.next() ,因为这也会懒惰地从文件中读取和生成行。

此函数适用于各种行尾,但与往常一样,在文件中混用行尾时要小心。

>>> list(iter_splitlines('\nhi\nbye\n'))
['', 'hi', 'bye', '']
>>> list(iter_splitlines('\r\nhi\rbye\r\n'))
['', 'hi', 'bye', '']
>>> list(iter_splitlines(''))
[]
boltons.strutils.multi_replace(text, sub_map, **kwargs)[源代码]

在单个调用中调用MultiReplace的快捷函数。

示例用法::

from boltons.stringutils import multi_replace
new = multi_replace(
    'The foo bar cat ate a bat',
    {'foo': 'zoo', 'cat': 'hat', 'bat': 'kraken'}
)
new == 'The zoo bar hat ate a kraken'
boltons.strutils.ordinalize(number, ext_only=False)[源代码]

转弯 number 转换为其基本形式,即第一、第二、第三、第四等。如果最后一个字符不是数字,则返回不变的字符串值。

参数:
  • number (int or str) -- 要进行基数处理的数字。

  • ext_only (bool) -- 是否仅返回后缀。默认 False

>>> print(ordinalize(1))
1st
>>> print(ordinalize(3694839230))
3694839230th
>>> print(ordinalize('hi'))
hi
>>> print(ordinalize(1515))
1515th
boltons.strutils.parse_int_list(range_string, delim=',', range_delim='-')[源代码]

参数返回正整数的排序列表。 range_string 。反转 format_int_list()

参数:
  • range_string (str) -- 逗号分隔的正整数或范围的字符串(例如‘1,2,4-6,8’)。打印机对话框中使用的自定义页面范围字符串的典型特征。

  • delim (char) -- 默认为‘,’。分隔整数和连续的整数范围。

  • range_delim (char) -- 默认为‘-’。指示整数的连续范围。

>>> parse_int_list('1,3,5-8,10-11,15')
[1, 3, 5, 6, 7, 8, 10, 11, 15]
boltons.strutils.pluralize(word)[源代码]

半智能地将一名英国人 word 从单数形式到复数形式,保留大小写模式。

>>> pluralize('friend')
'friends'
>>> pluralize('enemy')
'enemies'
>>> pluralize('Sheep')
'Sheep'
boltons.strutils.singularize(word)[源代码]

半智能地转换英语复数 word 到它的单数形式,保留大小写模式。

>>> singularize('chances')
'chance'
>>> singularize('Activities')
'Activity'
>>> singularize('Glasses')
'Glass'
>>> singularize('FEET')
'FOOT'
boltons.strutils.slugify(text, delim='_', lower=True, ascii=False)[源代码]

一个基本函数,用于将充满可怕字符(即标点符号和空格)的文本转换为相对安全的小写字符串,仅由指定的分隔符分隔 delim ,它缺省为 _

这个 ascii 便利旗帜将 asciify() 如果您需要仅限ASCII的弹头,则可以选择弹头。

>>> slugify('First post! Hi!!!!~1    ')
'first_post_hi_1'
>>> slugify("Kurt Gödel's pretty cool.", ascii=True) ==         b'kurt_goedel_s_pretty_cool'
True
boltons.strutils.split_punct_ws(text)[源代码]

而当 str.split() 将在空格上拆分, split_punct_ws() 将在标点符号和空格上拆分。这是由内部使用的 slugify() 上图。

>>> split_punct_ws('First post! Hi!!!!~1    ')
['First', 'post', 'Hi', '1']
boltons.strutils.strip_ansi(text)[源代码]

将ANSI转义代码从 text 。在日志或重定向输出意外捕获控制台颜色代码等情况下非常有用。

>>> strip_ansi('art')
'art'

支持字符串、字节和字节数组内容作为输入。返回与输入相同的类型。

有许多ANSI ART可用于测试 sixteencolors.net 。此函数不解释或呈现ANSI图片,但您可以使用 ansi2imgescapes.js

boltons.strutils.under2camel(under_string)[源代码]

将带下划线的字符串转换为驼色大小写。用于将函数名转换为类名。

>>> under2camel('complex_tokenizer')
'ComplexTokenizer'
boltons.strutils.unit_len(sized_iterable, unit_noun='item')[源代码]

返回迭代数的纯英语描述 len() ,有条件地用复数 cardinalize() ,详情如下。

>>> print(unit_len(range(10), 'number'))
10 numbers
>>> print(unit_len('aeiou', 'vowel'))
5 vowels
>>> print(unit_len([], 'worry'))
No worries
boltons.strutils.unwrap_text(text, ending='\n\n')[源代码]

文本解开,这是对 textwrap.wrap()

>>> text = "Short \n lines  \nwrapped\nsmall.\n\nAnother\nparagraph."
>>> unwrap_text(text)
'Short lines wrapped small.\n\nAnother paragraph.'
参数:
  • text -- 要解开的字符串。

  • ending (str) -- 要连接所有未换行段落的字符串。经过 None 才能拿到名单。为与Markdown和RST兼容,默认设置为‘nn’。