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

2024-04-25 12:26:06 发布

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

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

  • 单词中至少应有2个点,例如,a.b仍然a.b,但a.b.c是匹配项
  • 这应该只在1或2个字母上匹配。例如,a.bb.c是一个匹配项(因为abbc分别是1或2个字母),但aaa.b.cc不是一个匹配项(因为aaa由3个字母组成)

以下是我到目前为止所做的尝试:

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

这不是我想要的。谢谢你的帮助


Tags: textimportre字母情况be单词word
2条回答
^(?=(?:.*?\.){2,}.*$)[a-z]{1,2}(?:\.[a-z]{1,2})+$

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

见演示

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

.点开始匹配时,不要确保前面有一个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单词边界

Regex demoPython 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

相关问题 更多 >