Как удалить определенную длину цифр из текста?

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу очистить свой текст, удалив из него определенную длину цифр, поэтому я определяю для него правило. Я думаю, isdigit с этим хорошо иметь дело, но если я использую это, он отбросит все цифры в тексте. в моем тесте последние 10 цифр не добавлены в текст, поэтому я мог бы их удалить. Вот что я попробовал:

 urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
        'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']

cols = ['c1', 'c2', 'c3', 'c4']
make_me = []
for url in urls:
    lst = url.split("/")
    # your business rules go here
    make_me.append([x for x in lst if not x.isdigit() and not x == ""])

df = pd.DataFrame(make_me, columns=cols)
df

res=[]
for i in df.c4: 
    lst=i.split("-") 
    res.append([''.join(x) for x in lst if not x.isdigit()])
  

моя попытка отбросила все цифры в тексте. Я просто хочу такой вывод:

 tax march donald trump protest
list 2018 oscar nominations
  

как я должен написать правило, чтобы получить этот вывод? Есть идеи?

Комментарии:

1. Можете ли вы гарантировать, что извлекаемый текст всегда находится между двумя последними / и перед последним - ?

2. @Austin да, я могу гарантировать, как вы знаете, последние 10 цифр не связаны с текстом, поэтому я не хочу, чтобы они были в тексте. в принципе, я хочу создать новые места расположения, разделив завитки, чтобы получить заголовок новости (например, tax march donald trump protest ) без последних 10 цифр. Есть красивое решение для этого?

3. похоже, регулярное выражение довольно излишне. Смотрите мое решение ниже.

Ответ №1:

Способ работы на чистом python без дополнительных модулей выглядит следующим образом:

 urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
        'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']

for x in urls:
    print(' '.join(x.rsplit('/', 2)[-2].split('-')[:-1]))

# tax march donald trump protest
# list 2018 oscar nominations
  

Если вам нужен список выходных данных, используйте понимание списка:

 [' '.join(x.rsplit('/', 2)[-2].split('-')[:-1]) for x in urls]
  

Комментарии:

1. @woody, тебе нужен список в конце? Если да, дерзайте. Не используйте иначе.

2. Мне не нужен список, я хочу создать из них новые столбцы. поскольку ваше решение довольно эффективное, можно ли создать новый фрейм данных, добавив их в качестве нового столбца? как сформировать новый фрейм данных? Есть идеи?

3. @woody, уверен, что ты можешь использовать. Дело в том, что компиляторы списков предназначены для создания списков. Если вам нужен список для передачи при создании фрейма данных, подойдет list comp.

4. есть какое-нибудь красивое решение, чтобы это произошло?

5. @woody, извините за задержку. Не уверен, о чем вы спрашиваете. Если вы спрашиваете, как создать dataframe из имеющихся у вас входных данных, пожалуйста, обратитесь к некоторым вопросам SO (надеюсь, что они есть), иначе это стоит нового вопроса. Ответ на этот первоначальный вопрос получен.

Ответ №2:

Предполагая, что вы хотите извлечь URL-адреса того же формата, используйте регулярные выражения

 import re

urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
        'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']
news = []
regex =re.compile(r'/news/(.*)-')
for url in urls:
    extract_id = regex.search(url)
    if extract_id:
        data = extract_id.group(1)
        news.append(data.replace('-',' '))

print(news)
  

Вывод

 ['tax march donald trump protest', 'list 2018 oscar nominations']
  

Отредактированный формат в соответствии с вопросом.

Ответ №3:

К этому может быть много подходов. Используйте .rfind('-') , чтобы получить крайний правый индекс ‘-‘, а затем разрежьте вашу строку. После этого вы можете обработать строку дальше.

Комментарии:

1. Как вы сказали, проблема с ‘numbers’, вы можете сначала удалить все ненужные числа с помощью среза, найдя их индекс. например, срез из ‘news’ по его индексу, затем также 10 цифр в конце, найдя правильный индекс ‘-‘ и, наконец, ваш цикл для удаления других нежелательных символов

Ответ №4:

В этом случае у вас есть очень конкретное правило, которое поможет вам — просто удалите последние 10 символов из последнего интересующего элемента. В этом случае lst[-2] = lst[-2][:-12] прямо перед make_me.append вызовом сработало бы.

Если вы действительно хотите сделать это с помощью регулярного выражения, я бы использовал маркер конца строки, $, чтобы убедиться, что цифры были в конце. Это выглядело бы как lst = re.sub('[0-9]{10}/$','',url)

после импорта re , конечно. Это читается как:

re.sub — это метод подстановки в модуле регулярных выражений, и он изменяет совпадения с регулярным выражением в первом параметре с содержимым во втором параметре; третий параметр — это строка, в которой вы хотите произвести подстановку.

Регулярное выражение, которое я написал, соответствует «последовательности из 10 символов, которые соответствуют любому из 0123456789, за которым следует / и конец строки».