替换小于指定长度的连续非空格元素



我有一个python字符串

'AAAAA     BBB      AAAAA   AA     BBBBBB'

中间有空格。

我需要输出将低于一定长度的非零岛替换为空格。

例如,假设我需要替换长度小于 4 个字符的字符串,那么我的输出应如下所示:

'AAAAA              AAAAA          BBBBBB'

其他角色的位置相同。

使用正则表达式,使用re模块:

import re
re.sub(r'bw{1,3}b', lambda m: ' ' * len(m.group()), inputstring)

3是连续字符的最大数量。

分解一下:

  • re.sub(pattern, replacement, string)将使用patternstring中找到匹配项,然后使用replacement模式或函数生成替换项,并返回一个新字符串。
  • bw{1,3}b使用的模式。
    • b单词边界;这些边界在单词和非单词字符之间或在开头或结尾处匹配;此处在空格和字母之间匹配。通过将它们放在w的任一端意味着我们只需要每侧都有空格或字符串开头或结尾的匹配项。
    • w匹配"单词"字符,即字母、数字和下划线。
    • {n,m}声明一个模式必须在nm次之间重复;你可以不省略一个或另一个,或者随心所欲。{1,3}表示 1 到 3 倍与w匹配的字符。
  • 替换是一个函数,为每个匹配的子字符串传递一个匹配对象。在这里,它返回与输入字符串长度匹配的多个空格。

有关详细信息,请参阅正则表达式 HOWTO

如果要保留长度变量,请使用格式将数字添加到模式中:

def blank_out_up_to(string, length):
return re.sub(
rf'bw{{1,{length}}}b',
lambda m: ' ' * len(m.group()), 
string)

演示:

>>> example = 'AAAAA     BBB      AAAAA   AA     BBBBBB'
>>> for i in range(1, 6):
...     print(f'{i}: {blank_out_up_to(example, i)}')
...
1: AAAAA     BBB      AAAAA   AA     BBBBBB
2: AAAAA     BBB      AAAAA          BBBBBB
3: AAAAA              AAAAA          BBBBBB
4: AAAAA              AAAAA          BBBBBB
5:                                   BBBBBB

这是使用re的另一个变体,

inp = 'AAAAA     BBB      AAAAA   AA     BBBBBB'
''.join([x if len(x) > 3 else ' ' * len(x) for x in re.split(r'(s+)', inp)])
>> 'AAAAA              AAAAA          BBBBBB'

这是一个使用itertools的反正则表达式解决方案。

如您的示例所示,如果您的组由相同的字符组成,则此方法有效。如果不能保证这一点,则应使用正则表达式方法。

from itertools import groupby, chain
x = 'AAAAA     BBB      AAAAA   AA     BBBBBB'
res = ''.join(chain.from_iterable(i if len(i)>3 else ' '*len(i) for i in
(''.join(j) for _, j in groupby(x))))
print(res)
# "AAAAA              AAAAA          BBBBBB"

最新更新