#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, за которым следует / и конец строки».