Python 正则表达式从点分隔的字母中删除点
Python regex remove dots from dot separated letters
我想去掉单词中的点,这样 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 个字母组成)
这是我到目前为止尝试过的方法:
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
一个单词边界
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 它是一个匹配项,您可以使用任何简单的方法删除 .
。
查看演示。
我想去掉单词中的点,这样 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 个字母组成)
这是我到目前为止尝试过的方法:
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
一个单词边界
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 它是一个匹配项,您可以使用任何简单的方法删除 .
。
查看演示。