我想省略像a.b.c.d
(变成abcd
)这样的单词中的点,但在某些情况下:
a.b
仍然a.b
,但a.b.c
是匹配项李>a.bb.c
是一个匹配项(因为a
、bb
和c
分别是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
这不是我想要的。谢谢你的帮助
您可以使用它来匹配字符串。如果匹配,您可以使用任何简单的方法删除
.
见演示
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倍(?:
非捕获组\.[a-zA-Z]{1,2}
匹配一个点和一个字符a-zA-Z的1或2倍){2,}
关闭非捕获组并重复2次或更多次以匹配至少2个点\b
单词边界Regex demoPython demo
输出
相关问题 更多 >
编程相关推荐