Регулярное выражение для последних слов в строке?

#python #regex

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

Вопрос:

Допустим, у меня есть строка, такая как:

 Woori Finance Holdings Co Ltd
Alliance One International Inc
  

И я хочу удалить такие вещи, как Co, Company, International и т.д., Независимо от регистра, если они находятся в конце строки.

 re.compile(r'b(Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Ltd|LP|plc|Group|The|Co|International)$',
           flags=re.IGNORECASE)
  

Этому регулярному выражению удается найти последний элемент строки, но как мне продолжить работу до тех пор, пока оно не наткнется на слово, которого нет в регулярном выражении; т. Е. Приведенные выше строки приведут к:

 Woori Finance Holdings
Alliance One
  

Я также хочу добавить, что я бы не хотел удалять Company , если бы это было в начале или середине строки, только если это часть конца строки.

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

1. Попробуйте удалить $

2. @DroidX86 Затем это соответствует Co ca- Co la Co , тогда как я бы хотел сопоставить только окончательный Co

Ответ №1:

Вы можете использовать это регулярное выражение для сопоставления 1 удаляемых слов в конце:

 (?:s (?:Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Ltd|LP|plc|Group|The|Co|International)) s*$
  

Демонстрация регулярных выражений

Для использования Python:

 regex = re.compile(r'(?:s (?:Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Ltd|LP|plc|Group|The|Co|International)) s*$', re.MULTILINE | re.IGNORECASE)

s = regex.sub('', s)
  

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

1. Это определенно работает, но нужны ли были дополнительные процессоры? Я спрашиваю, потому что однажды я хочу достичь вашего уровня. Они также работали, хотя и с 1 конечным пробелом. re.sub('(?i)(Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Ltd|LP|plc|Group|The|Co|International)[ ]*', '', s) и re.sub('(?i)(?:(Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Ltd|LP|plc|Group|The|Co|International))[ ]*', '', s)

2. Два варианта, которые вы предлагаете, оставят пробел в исходной строке. Более того, оба предложенных вами регулярных выражения будут очень медленными по сравнению с тем, которое я опубликовал. Вы можете проверить отсутствие шагов, предпринятых на веб-сайте regex101, и подтвердить.

Ответ №2:

Вы можете использовать re.sub для замены последних ненужных символов:

 import re

s1 = 'Woori Finance Holdings Co Ltd'
s2 = 'Alliance One International Inc'

pattern = re.compile(r'b(Incorporated|Corporation|Company|Inc Common Stock|QQQ|ETF|PLC|SA|Inc|Corp|Co Ltd|Ltd|LP|plc|Group|The|Co|International)$', flags=re.IGNORECASE)

print(re.sub(pattern, '', s1))
# Woori Finance Holdings

print(re.sub(pattern, '', s2))
# Alliance One International
  

Обратите внимание, что я также добавил 'Co Ltd' как часть шаблона для сопоставления.

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

1. Если первый ввод Woori Finance Holdings Corporation Ltd , то он не будет работать. В вашем регулярном выражении не может быть каждой комбинации нескольких удаляемых слов.