#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
, то он не будет работать. В вашем регулярном выражении не может быть каждой комбинации нескольких удаляемых слов.