im正在尝试使用python从instagram进行数据清理。
我需要删除那些重复的字母,但在(a,g(上只删除它们,直到有2个重复的字母(aa,gg(
看起来是这样的
输入:mengganti,maaf,ppuuutttiiiihhh,mmmmeeeeerrrraaaah,maagggz
所需输出:mengganti、maaf、putih、meraah、maaggz
我现在用regex做的是这样的:
re.compile(r'(.)1{1,}', re.IGNORECASE).sub(r'1',kalimat)
输入:mengganti,maaf,ppuuutttiiiihhh,mmmmeeeeerrraaaah,maagggz
当前输出:menganti、maf、putih、merah、magz
注意:不必使用regex
您可以首先捕获a
和g
,并用2次组1替换。
([ag])1+
模式匹配:
([ag])
捕获组1,匹配a
或g
1+
对第1组匹配的相同字符重复1次以上
然后替换除a
g
或空白字符之外的所有字符,并替换为单个组1以删除重复字符。
([^sag])1+
模式匹配:
(
捕获组1[^sag]
匹配除a或g之外的非空白字符
)
关闭组11+
对第1组匹配的相同字符重复1次以上
例如
import re
s = "mengganti, maaf, ppuuutttiiiihhh, mmmmeeeeerrrraaaah, maaagggz"
print(re.sub(
r"([^sag])1+",
r"1",
re.sub(r"([ag])1+", r"11", s))
)
输出
mengganti, maaf, putih, meraah, maaggz
请参阅Python演示。
或者使用具有交替|
的单个图案来组合具有2个捕获组的2个图案,并且使用具有λ:
import re
pattern = r"([ag])1+|([^sag])2+"
s = "mengganti, maaf, ppuuutttiiiihhh, mmmmeeeeerrrraaaah, maaagggz"
result = re.sub(
pattern,
lambda x: x.group(1) * 2 if x.group(1) else x.group(2),
s
)
if result:
print(result)
输出
mengganti, maaf, putih, meraah, maaggz
查看另一个Python演示或regex演示
正则表达式的替代方案是itertools.groupby
:
from itertools import groupby
def remove_dups(seq, exclude):
# gather the intermediate results here
result = []
# for each letter and consecutive group it leads...
for letter, group in groupby(seq):
# get the length of the group
group_len = len(list(group))
if letter not in exclude or group_len < 2:
# e.g., either not "a" or "g", or appears once in a row
result.append(letter)
else:
# "a" or "g"; repeat by 2
result.append(letter * 2)
# new string with join
return "".join(result)
或等效于单线:
def remove_dups(seq, exclude):
return "".join(letter
if letter not in exclude or len(list(gr)) < 2
else 2 * letter
for letter, gr in groupby(seq))
groupby
返回以字母为关键字的连续组。如果信件不被排除在外,则按原样放在那里;如果连续的字母数小于2,它仍然按原样放在那里。如果我们需要排除它,我们把它放在重复量为2的地方。
样品运行:
>>> remove_dups("mengganti", exclude={"a", "g"})
"mengganti"
>>> remove_dups("maaf", exclude={"a", "g"})
"maaf"
>>> remove_dups("ppuuutttiiiihhh", exclude={"a", "g"})
"putih"
>>> remove_dups("mmmmeeeeerrrraaaah", exclude={"a", "g"})
"meraah"