如何删除重复的信函,但添加一些例外信函

2024-05-14 13:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python从instagram中清理数据。
我需要删除那些重复的字母,但在(a,g)上,只删除它们,直到有两个重复的字母(aa,gg)

看起来是这样的
输入:mengganti、maaf、ppuutttiiiiihh、mmmmmeeeeerrraaaah、maaaggz
所需输出:孟甘蒂、马夫、普提赫、梅拉、马格斯

我目前对regex的操作如下:

re.compile(r'(.)\1{1,}', re.IGNORECASE).sub(r'\1',kalimat)

输入:mengganti、maaf、ppuuttiiiiihh、mmmmmeeeerrraaaah、maaggz
当前输出:menganti、maf、putih、merah、magz
注意:它不必使用正则表达式


Tags: 数据re字母regexinstagramaacompilegg
2条回答

正则表达式的替代方法是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"

您可以首先捕获ag并替换为2次组1

([ag])\1+

模式匹配:

  • ([ag])捕获组1,匹配ag
  • \1+对组1中匹配的相同字符重复1+次

然后替换除a{}或空白字符以外的所有字符,并替换为单个组1以删除重复字符

([^\sag])\1+

模式匹配:

  • (捕获组1
    • [^\sag]匹配除a或g之外的非空白字符
  • )关闭组1
  • \1+对组1中匹配的相同字符重复1+次

比如说

import re

s = "mengganti, maaf, ppuuutttiiiihhh, mmmmeeeeerrrraaaah, maaagggz"

print(re.sub(
        r"([^\sag])\1+",
        r"\1",
        re.sub(r"([ag])\1+", r"\1\1", s))
)

输出

mengganti, maaf, putih, meraah, maaggz

见a Python demo


或者使用具有交替{}的单个模式,组合具有2个捕获组的2个模式,并使用re.sub和lambda:

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 demo或一个regex demo

相关问题 更多 >

    热门问题