2016-01-04 2 views
2

Учитывая твито, как следующее:регулярного выражения для удаления объектных имен

Brick Brewing Co Limited (BRB) Downgraded by Cormark to Market Perform 

Brinker International Inc (EAT) Upgraded by Zacks Investment Research to Hold 

Как написать регулярное выражение, которое удаляет как "by Cormark" и "by Zacks Investment Research"

Я попытался это:

"by ([A-Za-z ]+\w to)" 

с помощью питона но для этого требуется слово «to». Я хотел бы, чтобы регулярное выражение останавливалось, прежде чем записывать слово «в».

Было бы также интересно, если бы кто-нибудь мог показать мне, как писать регулярное выражение, которое захватывает примеры верблюда, например "Zacks Investment Research".

+0

Вы имеете в виду, чтобы удалить все строки, начинающиеся с «от» и заканчивается раньше «в»? –

+0

Есть много таких строк, да. – CodeConfusion

+1

Вы можете использовать группы без захвата, чтобы игнорировать «by» и «to». Проверьте это: https://docs.python.org/2/howto/regex.html#non-capturing-and-named-groups. – nikihub

ответ

2

Чтобы удалить все заглавные слова после by, вы можете использовать

by [A-Z][a-z]*(?: +[A-Z][a-z]*)* 

См regex demo

Объяснение:

  • by - буквальное последовательность из 3-х символов b, y и через space
  • [A-Z][a-z]* - это капитализированное слово (один верхний регистр следует ноль или более строчных буквы)
  • (?: +[A-Z][a-z]*)* - ноль или более последовательности ...
    • +[A-Z][a-z]* - 1 или более пробелов с последующим прописной буквой следует ноль или более строчные буквы.

Регулярное пространство может быть заменен \s в шаблоне, чтобы соответствовать любой пробел. Кроме того, чтобы соответствовать словам CaMeL, вы можете заменить все [a-z] на [a-zA-Z].

3

Вы можете использовать positive look-ahead для того, чтобы исключить слово to:

>>> s1 = "Brick Brewing Co Limited (BRB) Downgraded by Cormark to Market Perform" 
>>> 
>>> s2 = "Brinker International Inc (EAT) Upgraded by Zacks Investment Research to Hold" 
>>> 
>>> import re 
>>> re.sub(r'by[\w\s]+(?=to)','',s1) 
'Brick Brewing Co Limited (BRB) Downgraded to Market Perform' 
>>> re.sub(r'by[\w\s]+(?=to)','',s2) 
'Brinker International Inc (EAT) Upgraded to Hold' 
>>> 

Обратите внимание, что регулярное выражение [\w\s]+ будет соответствовать любой комбинации символов слов и пробелов. Если вы просто хотите совместить алфавитные символы и пробел, вы можете использовать [a-z\s] с флагом re.I (Игнорировать случай).

+2

Если вы планируете использовать это решение, не забудьте границы слов вокруг 'to':' (? = \ Bto \ b) '. –

+1

@stribizhev Я думаю, что нет необходимости в границах, потому что look-ahead не соответствует «to», за которым следуют или предшествуют лишние слова. – Kasramvd

0

Вы также можете сделать это с str методом index затем просто нарезать и сложить:

>>> def remove_name(s): 
     b = s.index(' by ') 
     t = s.index(' to ') 
     s = s[:b]+s[t:] 
     return s 
>>> 
>>> s = 'Brick Brewing Co Limited (BRB) Downgraded by Cormark to Market Perform' 
>>> remove_name(s) 
'Brick Brewing Co Limited (BRB) Downgraded to Market Perform' 
>>> 
>>> s = "Brinker International Inc (EAT) Upgraded by Zacks Investment Research to Hold" 
>>> remove_name(s) 
'Brinker International Inc (EAT) Upgraded to Hold' 
Смежные вопросы