2016-10-08 3 views
0

ПРИМЕЧАНИЕ. Я неопытен регулярными выражениями.python, удаляющий ссылки из научной статьи

Я хочу, чтобы превращать научные статьи в треки iTunes. Для этого я копирую и вставляю текст в файлы txt и конвертирую их в голосовые дорожки. Однако, когда я делаю это, ссылки включаются, и голос компьютера читает их вслух, например. »(Smith J. et al., 2016)», и это раздражает, поскольку я хотел бы, чтобы он пропускал что-либо в скобках, содержащих ссылку. Следовательно, я хочу создать скрипт python, который удаляет все эти ссылки из файла txt, прежде чем преобразовывать его в разговорную дорожку. Я считаю, что я мог бы сделать это с чем-то вроде следующего кода:

start_ref=find("(") 
finish_ref=find(")", start_ref) 
# then remove all pieces of the string between each start and finish 

Но это не является достаточно точным. Вместо этого я хотел бы как-то использовать регулярные выражения.

может кто-то показать мне пример кода о том, как я бы итерационные удалить ссылки из следующего текста (при учете различных стилей, ссылающийся, например, Гарвард против АРА и т.д.):

«Этот метод был показало, что они превзошли ранее обсуждавшиеся методы (Smith, J. et al., 2014), и, несмотря на то, что он имеет отклонения, ясно, что преимущества перевешивают недостатки (Jones, A. & Karver, B., 2009 , Lubber, H. et al., 2013). "

Может ли кто-нибудь предоставить пример кода?

+1

Я думаю, вам понадобится больше, чем регулярное выражение, чтобы различать ссылку и некоторые другие скобки. – chepner

+0

Echoing @ комментарий chepner, регулярных выражений, вероятно, будет недостаточно. Вы можете взглянуть на обработку естественного языка. – MattDMo

+0

Кейтеринг только для одного из разных стилей - Гарвард * или * АПА - сам по себе уже довольно сложный вопрос. Blithely попытка поймать оба приведет только к еще более ложным матчам. – usr2564301

ответ

1

Это должно сделать трюк:

import re 

a = "This method has been shown to outperform previously discussed methods (Smith, J. et al., 2014) and while it has its draw-backs, it is clear that the benefits outweigh the disadvantages (Jones, A. & Karver, B., 2009, Lubber, H. et al., 2013)." 

a = re.sub(r"\s\([A-Z][a-z]+,\s[A-Z][a-z]?\.[^\)]*,\s\d{4}\)", "", a) 

Он заменяет на «» (т.е. ничего) каждая строка из пространства, (, одна заглавная буква не следует один или более строчных букв (т.е. имя) , запятую, пробел, одну заглавную букву и точку (необязательно разделяемую строчной буквой для таких имен, как Кристина, которая будет сокращена до Ch.), затем ничего, кроме закрывающей круглой скобки, пока мы не достигнем запятой, пробела, четырех цифр и закрывающей круглой скобкой. Подводя итог, предполагается, что все, что выглядит как (Azdfs, E. stuff 2343), должно быть удалено. Думаю, этого должно быть недостаточно, чтобы не переусердствовать.

Выход я с моим кодом является This method has been shown to outperform previously discussed methods and while it has its draw-backs, it is clear that the benefits outweigh the disadvantages.

2

что-то вроде

import re 
text = ... 
re.sub(r'\((?:[\w \.&]+\,)+[0-9]{4}\)', text) 

, кажется, сделать это. Вы можете использовать Debuggex, чтобы тренироваться в регулярном выражении.

Смежные вопросы