Python regex删除字母数字字符而不删除字符串末尾的单词

2024-09-27 04:25:24 发布

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

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

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

Tags: plusmaxprozoomlgm1nokialiquid
2条回答

您可以为正则表达式添加一个正向的前瞻性,要求末尾的单词至少包含一个数字,以便将其删除:(?=\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+次character类中列出的任何
  • [A-Za-z]匹配字符a-zA-Z
  • $字符串结尾

Regex demo

在替换中使用空字符串。你知道吗

相关问题 更多 >

    热门问题