Python正则表达式从点分隔字母中删除点

Python正则表达式从点分隔字母中删除点,python,regex,regex-group,re,Python,Regex,Regex Group,Re,我想省略像a.b.c.d(变成abcd)这样的单词中的点,但在某些情况下: 单词中至少应有2个点,例如,a.b保留a.b,但a.b.c是匹配项 这应该只在1或2个字母上匹配。例如,a.bb.c是一个匹配项(因为a,bb和c各有1或2个字母),但aaa.b.cc不是一个匹配项(因为aaa由3个字母组成) 以下是我到目前为止所做的尝试: 重新导入 文本=[ “a.b.c”应该是“abc” “ab.c.dd.ee”应该是:“abcddee” “a.b”应保留为“a.b” ] 对于文本中的文本: t

我想省略像
a.b.c.d
(变成
abcd
)这样的单词中的点,但在某些情况下:

  • 单词中至少应有2个点,例如,
    a.b
    保留
    a.b
    ,但
    a.b.c
    是匹配项
  • 这应该只在1或2个字母上匹配。例如,
    a.bb.c
    是一个匹配项(因为
    a
    bb
    c
    各有1或2个字母),但
    aaa.b.cc
    不是一个匹配项(因为
    aaa
    由3个字母组成)
以下是我到目前为止所做的尝试:

重新导入
文本=[
“a.b.c”应该是“abc”
“ab.c.dd.ee”应该是:“abcddee”
“a.b”应保留为“a.b”
]
对于文本中的文本:
text=re.sub(r'(\)(?P[a-zA-Z]{1,2})){2,}',r'\g',text)
打印(文本)
这将选择“后跟1或2个字母的任意点”,重复2次或更多次。选择工作正常,但替换为组只会导致最后一次匹配,重复被忽略

因此,它打印:

ac
abee
a.b

这不是我想要的。如果有任何帮助,我将不胜感激。

点开始匹配。请不要确保前面有char a-zA-Z

如果在替换中使用命名组
word
,则该组将包含上一次迭代的值,因为它本身在重复组中


您可以将2个或多个点与字符a-zA-Z的1或2倍匹配,并在存在匹配项时用空字符串替换这些点

要防止
aaa.b.cc
匹配,可以使用单词边界
\b

\b[a-zA-Z]{1,2}(?:\.[a-zA-Z]{1,2}){2,}\b
模式匹配:

  • \b
    防止单词成为较大单词的一部分的单词边界
  • [a-zA-Z]{1,2}
    匹配字符a-zA-Z的1或2倍
  • (?:
    非捕获组
    • \.[a-zA-Z]{1,2}
      匹配一个点和一个字符a-zA-Z的1或2倍
  • ){2,}
    关闭非捕获组并重复2次或更多次以匹配至少2个点
  • \b
    单词边界
|

输出

abc
abcddee
a.b
aaa.b.cc
您可以使用它来匹配字符串。如果匹配,您可以使用任何简单的方法删除

见演示

abc
abcddee
a.b
aaa.b.cc
^(?=(?:.*?\.){2,}.*$)[a-z]{1,2}(?:\.[a-z]{1,2})+$