Kon*_*nov -2 python string text set python-3.x
我如何才能从字符串中删除特定的重复字符,只有当它们在Python中一个接一个地出现时?例如:
A 有字符串
string = "Hello _my name is __Alex"
Run Code Online (Sandbox Code Playgroud)
仅当重复的 _ 一一对应 __ 并得到如下字符串时,我才需要删除它们:
string = "Hello _my name is _Alex"
Run Code Online (Sandbox Code Playgroud)
如果我使用 set 我得到这个:
string = "_yoiHAemnasxl"
Run Code Online (Sandbox Code Playgroud)
(大编辑:哎呀,我错过了你只想删除某些字符而不是其他字符。改造解决方案......)
我假设您有一个字符串代表您想要删除重复的所有字符。我们称其为to_remove,并说它等于“_.-”。因此,只会删除下划线、句点和连字符。
您可以使用正则表达式来匹配字符的多个连续重复,并将它们替换为单个字符。
>>> import re
>>> to_remove = "_.-"
>>> s = "Hello... _my name -- is __Alex"
>>> pattern = "(?P<char>[" + re.escape(to_remove) + "])(?P=char)+"
>>> re.sub(pattern, r"\1", s)
'Hello. _my name - is _Alex'
Run Code Online (Sandbox Code Playgroud)
快速细分:
?P<char>将符号名称分配char给第一组。to_remove字符匹配集放入其中[]。有必要调用 re.escape,因为连字符和其他字符可能在集合内具有特殊含义。(?P=char)指回与命名组“char”匹配的字符。+该字符的一次或多次重复。因此总的来说,这意味着“匹配to_remove连续出现多次的任何字符”。sub,的第二个参数r"\1"然后将匹配项替换为第一组,该组只有一个字符长。
替代方法:编写一个生成器表达式,该表达式仅采用与前面的字符不匹配的字符。
>>> "".join(s[i] for i in range(len(s)) if i == 0 or not (s[i-1] == s[i] and s[i] in to_remove))
'Hello. _my name - is _Alex'
Run Code Online (Sandbox Code Playgroud)
替代方法#2:用于groupby识别连续的相同字符组,然后将这些值连接在一起,使用to_remove成员资格测试来决定应添加多少个值。
>>> import itertools
>>> "".join(k if k in to_remove else "".join(v) for k,v in itertools.groupby(s, lambda c: c))
'Hello. _my name - is _Alex'
Run Code Online (Sandbox Code Playgroud)
替代方法#3:re.sub为 to_remove 的每个成员调用一次。to_remove如果包含很多字符,则有点贵。
>>> for c in to_remove:
... s = re.sub(rf"({re.escape(c)})\1+", r"\1", s)
...
>>> s
'Hello. _my name - is _Alex'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3141 次 |
| 最近记录: |