用python压缩字符

用python压缩字符,python,regex,Python,Regex,如何使用python实现这一点: 如果我有一个如下格式的字符串: A..a.b.c 让它像: A.a.b.c 但我事先不知道我有多少个点 这就像linux中的tr-s函数善于发现模式(重复点)并替换它们(使用单个点): 善于发现图案(重复点)并将其替换(使用单个点): 如果希望使用常规格式将任何重复字符序列替换为其中一个字符: >>> import re >>> s='aaa,,bb,c' >>> re.sub(r'(.)(\1+)',

如何使用python实现这一点:

如果我有一个如下格式的字符串:

A..a.b.c
让它像:

A.a.b.c
但我事先不知道我有多少个点

这就像linux中的tr-s函数善于发现模式(重复点)并替换它们(使用单个点):

善于发现图案(重复点)并将其替换(使用单个点):


如果希望使用常规格式将任何重复字符序列替换为其中一个字符:

>>> import re
>>> s='aaa,,bb,c'
>>> re.sub(r'(.)(\1+)', r'\1', s)
'a,b,c'
>>> re.sub(r'([\w])(\1+)', r'\1', s)
'a,,b,c'
>>> re.sub(r'([,])(\1+)', r'\1', s)
'aaa,bb,c'
如果只想限制某些字符,请执行以下操作:

>>> import re
>>> s='aaa,,bb,c'
>>> re.sub(r'(.)(\1+)', r'\1', s)
'a,b,c'
>>> re.sub(r'([\w])(\1+)', r'\1', s)
'a,,b,c'
>>> re.sub(r'([,])(\1+)', r'\1', s)
'aaa,bb,c'
你的例子是:

>>> s='A..a.b.c'
>>> re.sub(r'([.])(\1+)', r'\1', s)
'A.a.b.c'

如果希望使用常规格式将任何重复字符序列替换为其中一个字符:

>>> import re
>>> s='aaa,,bb,c'
>>> re.sub(r'(.)(\1+)', r'\1', s)
'a,b,c'
>>> re.sub(r'([\w])(\1+)', r'\1', s)
'a,,b,c'
>>> re.sub(r'([,])(\1+)', r'\1', s)
'aaa,bb,c'
如果只想限制某些字符,请执行以下操作:

>>> import re
>>> s='aaa,,bb,c'
>>> re.sub(r'(.)(\1+)', r'\1', s)
'a,b,c'
>>> re.sub(r'([\w])(\1+)', r'\1', s)
'a,,b,c'
>>> re.sub(r'([,])(\1+)', r'\1', s)
'aaa,bb,c'
你的例子是:

>>> s='A..a.b.c'
>>> re.sub(r'([.])(\1+)', r'\1', s)
'A.a.b.c'

您希望用单个点替换两个或多个点的每次运行。这是这样实现的:

>>> import re
>>> re.sub(r'\.\.+', '.', 'A..a.b.c')
'A.a.b.c'
你不想也不需要用一个点替换一个或多个点

>>> re.sub(r'\.+', '.', 'A..a.b.c')
'A.a.b.c'
这会产生相同的结果,但会对孤立点进行无意义的替换(在您的示例中为3),因此速度要慢得多

时间:

python -mtimeit -s"import re;subber=re.compile(r'\.+').sub;s=1000*'a.'" "subber('.',s)"
1000 loops, best of 3: 212 usec per loop

python -mtimeit -s"import re;subber=re.compile(r'\.\.+').sub;s=1000*'a.'" "subber('.',s)"
10000 loops, best of 3: 23.2 usec per loop

您希望用单个点替换两个或多个点的每次运行。这是这样实现的:

>>> import re
>>> re.sub(r'\.\.+', '.', 'A..a.b.c')
'A.a.b.c'
你不想也不需要用一个点替换一个或多个点

>>> re.sub(r'\.+', '.', 'A..a.b.c')
'A.a.b.c'
这会产生相同的结果,但会对孤立点进行无意义的替换(在您的示例中为3),因此速度要慢得多

时间:

python -mtimeit -s"import re;subber=re.compile(r'\.+').sub;s=1000*'a.'" "subber('.',s)"
1000 loops, best of 3: 212 usec per loop

python -mtimeit -s"import re;subber=re.compile(r'\.\.+').sub;s=1000*'a.'" "subber('.',s)"
10000 loops, best of 3: 23.2 usec per loop

如果您真的不必使用正则表达式,这里有一个纯Python版本,只适用于点:

>>> ".".join(filter(bool, "A..a.b.c".split(".")))
'A.a.b.c'

如果您真的不必使用正则表达式,这里有一个纯Python版本,只适用于点:

>>> ".".join(filter(bool, "A..a.b.c".split(".")))
'A.a.b.c'

来自Python正则表达式HOWTO的附加信息:来自Python正则表达式HOWTO的附加信息:您还可以使用
r'\.{2,}'
@icktoofay:是的,您可以。它更通用,但速度较慢。这里真的需要优化吗?大多数人发现正则表达式很难验证和维护,因此通常情况下,最简单的正则表达式就是您希望在代码库中使用的正则表达式。@RaymondHettinger:优化从来都不是“真正需要的”。我曾指出,为满足要求而编写的正则表达式具有额外的效果,即它比不符合要求的正则表达式更快。这个问题的答案中的所有正则表达式对于大多数人来说都应该很容易理解、验证和维护。你也可以使用
r'\.{2,}'
@icktoofay:是的,你可以。它更通用,但速度较慢。这里真的需要优化吗?大多数人发现正则表达式很难验证和维护,因此通常情况下,最简单的正则表达式就是您希望在代码库中使用的正则表达式。@RaymondHettinger:优化从来都不是“真正需要的”。我曾指出,为满足要求而编写的正则表达式具有额外的效果,即它比不符合要求的正则表达式更快。回答这个问题的所有正则表达式对于大多数人来说都应该很容易理解、验证和维护。[-1]或者可能是
”。join(A.A.b.c.中x代表x)。split(“.”如果x)
。。。然而,这两种方法都在一个或多个点的引导运行或训练运行的输入上失败。示例:
'a.
'.b'
'.
[-1]或可能
”。连接(x代表“a.a.b.c”中的x)。拆分(“.”如果x)
。。。然而,这两种方法都在一个或多个点的引导运行或训练运行的输入上失败。示例:
'a.
'.b'
'.