Удалить строку после sla sh с условием - PullRequest
1 голос
/ 13 марта 2020

Я хотел бы удалить вторую часть фразы, если она длиннее 3 символов (букв и цифр) и добавить пробел, если символы 3 или меньше.

В следующем наборе тестов:

CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS
ABC/DEF
FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO
HAPPY SPRING BREAK 20/20

Результат должен быть :

CENTRAL CARE HOSPITAL
ABC DEF
FOUNDATION INSTITUTION
HAPPY SPRING BREAK 20 20

Моя первая попытка была такой:

([^\/]+$)

Однако все строки после sla sh пропали, потому что в нем отсутствуют какие-либо ограничения. Мне нужно включить отрицательный lookforward, утверждающий, что мне нужно удалить строки, если они имеют более 3 символов после sla sh:

text= re.sub(r'(^[^\/]+)(?:[\/])(?![A-Z]{3})',
             r'\1 ',
             text,
             0,
             re.IGNORECASE)

Я получаю следующее неверное сообщение:

CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS 
ABC DEF
FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO 
HAPPY SPRING BREAK 20 20

Как мне избавиться от sla sh и нити перед?

Спасибо

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Вы можете использовать 2 группы захвата для захвата 1-3 символов AZ или цифр до и после / и использовать эти группы в замене с пробелом между ними.

Используйте чередование, чтобы соответствовать вперед sla sh с последующим удалением остальной части жала.

\b([A-Z0-9]{1,3})/([A-Z0-9]{1,3})\b|/.*

При замене используйте 2 группы захвата

r"\1 \2"

Объяснение

  • \b Граница слова
  • ([A-Z0-9]{1,3}) Захват группа 1 , соответствует 1-3 раза по азимуту или ди git
  • / Совпадение буквально
  • ([A-Z0-9]{1,3}) Захват группа 2 , совпадение 1-3 раза AZ или ди git
  • \b Граница слова
  • | Или
  • /.* Совпадение / и 0+ раз с любым символом кроме новой строки

Regex demo | Python демо

Пример кода

import re

regex = r"\b([A-Z0-9]{1,3})/([A-Z0-9]{1,3})\b|/.*"

text = ("CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS\n"
    "ABC/DEF\n"
    "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO\n"
    "HAPPY SPRING BREAK 20/20")

result = re.sub(regex, r"\1 \2", text)
print (result)

Выход

CENTRAL CARE HOSPITAL 
ABC DEF
FOUNDATION INSTITUTION 
HAPPY SPRING BREAK 20 20
0 голосов
/ 14 марта 2020

Попробуйте этот шаблон регулярных выражений:

text= ["CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS ",
       "ABC/DEF",
       "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO",
       "HAPPY SPRING BREAK 20/20"]

for element in text:
    str_res = re.sub(r'(?:[\/])([A-Z0-9]{0,3}\b)|[^\/]*$',
                     r' \1',
                     element,
                     0,
                     re.IGNORECASE)
    print(str_res)
0 голосов
/ 13 марта 2020

Вы должны использовать регулярные выражения? Что не так с этим делать?

tests = [
    "CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS", 
    "ABC/DEF", 
    "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO", 
    "HAPPY SPRING BREAK 20/20"
]

for test in tests:
    separate = test.split("/", 1)
    print(separate[0] if len(separate[1])>3 else test)
...