Python如何确定字符串的结尾是4个字符还是5个字符遵循一种模式

2024-06-28 20:54:17 发布

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

我有一堆需要清理的字符串,它有以下模式:

12345SNET1
1234567SNETA2
123456SNET3

令人头痛的是,SNET之后的任何内容都可以是0到9之间的任何整数,也可以是a-Z中的字符加上0到9之间的整数

是否仍然可以使用正则表达式来检测字符串是否具有此模式,以便我可以使用:

if regex detect (returns True):
    str = str[:-1]

elif regex detect (returns True):
    str = str[:-2]

Tags: 字符串true内容if模式整数字符regex
3条回答
  • 您可以使用re.fullmatch检查(返回True是给定字符串与regex的全部匹配)与基本regex,如.*SNET\d.*SNET[A-Z]\d,也不要使用str作为变量名,它是一个内置字

    if re.fullmatch(r".*SNET\d", value):
        value = value[:-1]
    
    if re.fullmatch(r".*SNET[A-Z]\d", value):
        value = value[:-2]
    
  • 您可以直接使用re.sub替换结束符

    value = re.sub(r"(?<=SNET)[A-Z]?\d", "", value)
    

为了便于使用,您可以在方法中导出它

def clean(value):
    if re.fullmatch(r".*SNET\d", value):
        return value[:-1]
    if re.fullmatch(r".*SNET[A-Z]\d", value):
        return value[:-2]
    return value

# OR
def clean(value):
    return re.sub(r"(?<=SNET)[A-Z]?\d", "", value)


if __name__ == '__main__':
    values = ["12345SNET1", "1234567SNETA2", "123456SNET3"]
    print(values)  # ['12345SNET1', '1234567SNETA2', '123456SNET3']
    values = list(map(clean, values))
    print(values)  # ['12345SNET', '1234567SNET', '123456SNET']

如果使用正确的正则表达式,不需要有两个case

values = ["12345SNET1", "1234567SNETA2", "123456SNET3"]
for value in values:
    m = re.match(r'\d+SNET([A-Z]?\d)', value)
    if m:
        print(m.group(1))

这会打印出来

1
A2
3

如果希望文本位于最后一个字符之前,可以在正则表达式中添加额外的括号以捕捉该部分:

values = ["12345SNET1", "1234567SNETA2", "123456SNET3"]
for value in values:
    m = re.match(r'(\d+SNET)([A-Z]?\d)', value)
    if m:
        print(m.group(1))

结果

12345SNET
1234567SNET
123456SNET

您可以使用re.sub与正向查找相结合,以以下方式丢弃不需要的字符:

import re
s1 = "12345SNET1"
s2 = "1234567SNETA2"
s3 = "123456SNET3"
out1 = re.sub(r"(?<=SNET)[A-Z]?\d", "", s1)
out2 = re.sub(r"(?<=SNET)[A-Z]?\d", "", s2)
out3 = re.sub(r"(?<=SNET)[A-Z]?\d", "", s3)
print(out1)  # 12345SNET
print(out2)  # 1234567SNET
print(out3)  # 123456SNET

相关问题 更多 >