Регулярное выражение Python для удаления буквенно-цифровых символов без удаления слов в конце строки - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь очистить некоторый текст, удаляя буквенно-цифровые символы из конца строки, но я также удаляю обычные слова, как показано в выводе . Может ли кто-нибудь помочь мне достичь ожидаемого результата?

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

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вы можете добавить к регулярному выражению положительный прогноз, который требует, чтобы слово в конце содержало хотя бы одну цифру для удаления: (?=\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
0 голосов
/ 06 ноября 2019

Если это должно быть последнее слово в строке и всегда есть несколько слов, вы можете использовать:

[ \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
  • $ Конец строки

Regex demo

При замене используйте пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...