Python正则表达式,用于删除字母数字字符,而不删除字符串末尾的单词

Python正则表达式,用于删除字母数字字符,而不删除字符串末尾的单词,python,regex,Python,Regex,我试图通过删除字符串末尾的字母数字字符来清除一些文本,但我也删除了正常的单词,如输出所示。有人能帮我达到预期的结果吗 re.sub(r'[a-zA-Z0-9/]{5,}$', '', text) asus zenfone 3s max zc521tl asus zenfone max plus (m1) zb570tl asus zenfone max pro (m1) zb601kl/zb602k nokia 3.1 c nokia 3 asus zenfone 3 zoom ze553k

我试图通过删除字符串末尾的字母数字字符来清除一些文本,但我也删除了正常的单词,如输出所示。有人能帮我达到预期的结果吗

re.sub(r'[a-zA-Z0-9/]{5,}$', '', text)

asus zenfone 3s max zc521tl
asus zenfone max plus (m1) zb570tl
asus zenfone max pro (m1) zb601kl/zb602k
nokia 3.1 c
nokia 3
asus zenfone 3 zoom ze553k
asus zenfone 3 deluxe zs570kl
blackberry keyone
htc explorer
lg tribute
acer liquid z520
输出:

asus zenfone 3s max 
asus zenfone max plus (m1) 
asus zenfone max pro (m1) 
nokia 3.1 c
nokia 3
asus zenfone 3 zoom 
asus zenfone 3 deluxe 
blackberry 
htc 
lg 
acer liquid z520
asus zenfone 3s max
asus zenfone max plus (m1) 
asus zenfone max pro (m1)
nokia 3.1 c
nokia 3
asus zenfone 3 zoom 
asus zenfone 3 deluxe 
**blackberry keyone**
**htc explorer**
**lg tribute**
acer liquid z520
预期输出:

asus zenfone 3s max 
asus zenfone max plus (m1) 
asus zenfone max pro (m1) 
nokia 3.1 c
nokia 3
asus zenfone 3 zoom 
asus zenfone 3 deluxe 
blackberry 
htc 
lg 
acer liquid z520
asus zenfone 3s max
asus zenfone max plus (m1) 
asus zenfone max pro (m1)
nokia 3.1 c
nokia 3
asus zenfone 3 zoom 
asus zenfone 3 deluxe 
**blackberry keyone**
**htc explorer**
**lg tribute**
acer liquid z520

您可以向正则表达式添加一个正向前瞻,该正则表达式要求末尾的单词至少包含一个要删除的数字:
(?=\D*\D)
。这将阻止它删除不包含数字的普通单词

完整的程序:

#!/usr/bin/env python3
import re

texts = [
    'asus zenfone 3s max zc521tl',
    'asus zenfone max plus (m1) zb570tl',
    'asus zenfone max pro (m1) zb601kl/zb602k',
    'nokia 3.1 c',
    'nokia 3',
    'asus zenfone 3 zoom ze553k',
    'asus zenfone 3 deluxe zs570kl',
    'blackberry keyone',
    'htc explorer',
    'lg tribute',
    'acer liquid z520',
]

for text in texts:
    print(re.sub(r'(?=\D*\d)[a-zA-Z0-9/]{5,}$', '', text))
它输出:

asus zenfone 3s max 
asus zenfone max plus (m1) 
asus zenfone max pro (m1) 
nokia 3.1 c
nokia 3
asus zenfone 3 zoom 
asus zenfone 3 deluxe 
blackberry keyone
htc explorer
lg tribute
acer liquid z520

如果它应该是字符串中的最后一个单词,并且总是有多个单词,则可以使用:

[ \t]+(?=[a-zA-Z0-9/]{5})[a-zA-Z/]*[0-9][a-zA-Z0-9/]*[A-Za-z]$
  • [\t]+
    匹配1+个空格或制表符
  • (?=[a-zA-Z0-9/]{5})
    断言至少5个所列字符
  • [a-zA-Z/]*
    匹配所列任何一项的0+倍
  • [0-9]
    匹配一个数字
  • [a-zA-Z0-9/]*
    匹配字符类中列出的任何字符的0+倍
  • [A-Za-z]
    匹配字符A-Za-z
  • $
    字符串结尾


替换时使用空字符串。

为什么宏碁液体z520中的
z520
没有被移除?不需要移除