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

Python regex remove dots from dot separated letters

我想去掉单词中的点,这样 a.b.c.d 变成 abcd,但在某些情况下:

这是我到目前为止尝试过的方法:

import re
texts = [
    'a.b.c', # Should be: 'abc'
    'ab.c.dd.ee', # Should be: 'abcddee'
    'a.b' # Should remain: 'a.b'
]
for text in texts:
    text = re.sub(r'((\.)(?P<word>[a-zA-Z]{1,2})){2,}', r'\g<word>', text)
    print(text)

这会选择“任何点后跟 1 或 2 个字母”,重复 2 次或更多次。选择工作正常,但替换为组,仅导致最后一次匹配并且重复被忽略。

所以,它打印:

ac
abee
a.b

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

. 点开始匹配,但不能确保它前面有一个字符 a-zA-Z。

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


您可以将 2 个或更多点与 1 或 2 次字符 a-zA-Z 匹配,并在匹配时将这些点替换为空字符串。

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

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

模式匹配:

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

Regex demo | Python demo

import re

pattern = r"\b[a-zA-Z]{1,2}(?:\.[a-zA-Z]{1,2}){2,}\b"
texts = [
    'a.b.c',
    'ab.c.dd.ee',
    'a.b',
    'aaa.b.cc'
]

for s in texts:
    print(re.sub(pattern, lambda x: x.group().replace(".", ""), s))

输出

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

您可以使用它来匹配 string.If 它是一个匹配项,您可以使用任何简单的方法删除 .

查看演示。

https://regex101.com/r/BrNBtk/1