我有一个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)
将使用pattern
在string
中找到匹配项,然后使用replacement
模式或函数生成替换项,并返回一个新字符串。bw{1,3}b
使用的模式。b
单词边界;这些边界在单词和非单词字符之间或在开头或结尾处匹配;此处在空格和字母之间匹配。通过将它们放在w
的任一端意味着我们只需要每侧都有空格或字符串开头或结尾的匹配项。w
匹配"单词"字符,即字母、数字和下划线。{n,m}
声明一个模式必须在n到m次之间重复;你可以不省略一个或另一个,或者随心所欲。{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"