Регулярное выражение: условное удаление после косой черты - PullRequest
1 голос
/ 24 марта 2020

Я пытался избавиться от строк после форварда sla sh по определенным правилам.

При обнаружении форварда sla sh удалите строки, проверьте, есть ли перед ними более одного слова sla sh и более одного слова после sla sh (если две фразы разделены sla sh) для удаления строк после sla sh:

REYNOLDS COMMUNITY CENTER/CENTRALE DE SOINS REYNOLDS

Предыдущий пример имеет три слова перед sla sh и четыре слова после sla sh, тогда конечный результат должен быть:

REYNOLDS COMMUNITY CENTER

Однако в следующем примере:

AB/CDE COMMUNITY CENTER

Строка после / остается, потому что есть более чем одно слово (есть три слова), а до sla sh есть только одно слово. В этом случае только sla sh удаляется, чтобы получить окончательный результат следующим образом:

AB CDE COMMUNITY CENTER

Если у нас есть следующая строка:

REYNOLDS COMMUNITY CENTER/24

Последняя строка должна be:

REYNOLDS COMMUNITY CENTER 24

Сначала проверьте, что перед sla * есть более одного слова sh (содержит три), а после sla sh (24) есть только одно слово. Затем sla sh удаляется.

Правило состоит в том, чтобы хранить только строку перед sla sh, если в каждой стороне / находится более одного слова. С другой стороны, если есть только одно слово с любой стороны от /, то следует удалить sla sh.

До сих пор я безуспешно пытался получить предыдущее поведение с помощью следующего фрагмент:

import re
lst= ['REYNOLDS COMMUNITY CENTER/CENTRALE DE SOINS REYNOLDS',
      '100/10 COMMUNITY CENTER',
      'ROGERS COMMUNITY CENTER/CENTRAL CARE',
      'AB/CDE COMMUNITY CENTER',
      'REYNOLDS COMMUNITY CENTER/24']


for element in lst:
    result = re.sub(r'(^\w+\s+\w+[^/]+)/([A-Za-z]+(?:[^A-Za-z\n]+[A-Za-z]+)+[^A-Za-z\n]*$)?',
                    '\1',
                    element,
                    0,
                    re.IGNORECASE)
    print(result)

Предыдущие примеры должны дать следующие результаты:

REYNOLDS COMMUNITY CENTER
100 10 COMMUNITY CENTER
ROGERS COMMUNITY CENTER
AB CDE COMMUNITY CENTER
REYNOLDS COMMUNITY CENTER 24

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 24 марта 2020

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

r" (?:\w+\s)+\w+(\/.*)|\w+(\/).*

, заменяя содержимое группы захвата 1 (если сопоставлено) пустой строкой, а содержимое группы захвата 2 (если сопоставлено) пробелом.

Демонстрация

Python Движок регулярных выражений выполняет следующие операции:

(?:\w+\s+)+  # match 1+ word chars followed by 1+ spaces
\w+          # match 1+ word chars
(\/.*)       # match '/' followed by 1+ chars in capture group 1
|            # or
\w+          # match 1+ word chars
(\/)         # match '/' in capture group 2
.*           # match 1+ chars
0 голосов
/ 24 марта 2020

Я бы не стал делать это с RE. Несмотря на рекурсию и условные выражения, вы не можете считать сами по себе с помощью выражения. Почему бы не решить эту проблему с помощью строковых функций? Разделите, посчитайте слова и присоединитесь, где это необходимо. Например:

out = []
lst = ['REYNOLDS COMMUNITY CENTER/CENTRALE DE SOINS REYNOLDS',
      '100/10 COMMUNITY CENTER',
      'ROGERS COMMUNITY CENTER/CENTRAL CARE',
      'AB/CDE COMMUNITY CENTER',
      'REYNOLDS COMMUNITY CENTER/24']

for item in lst:
    parts = item.split("/")
    # leave item as is if there was no split:
    if len(parts) == 1:
        out.append(item)
        continue
    # Get number of words for halves:
    wordsL = len(parts[0].split())
    wordsR = len(parts[1].split())
    # Rules:
    if wordsL > 1 and wordsR > 1:
        out.append(parts[0])
    elif wordsL == 1 and wordsR > 1:
        out.append(" ".join(parts))
    elif wordsL > 1 and wordsR == 1:
        out.append(" ".join(parts))

print(out)

Я не использую Python, как вы, вероятно, можете сказать. ^^; Выход:

['REYNOLDS COMMUNITY CENTER', 
'100 10 COMMUNITY CENTER', 
'ROGERS COMMUNITY CENTER', 
'AB CDE COMMUNITY CENTER', 
'REYNOLDS COMMUNITY CENTER 24']
0 голосов
/ 24 марта 2020

Не уверен, что это пуленепробиваемый для большего списка, но для поставляемого списка попробуйте следующее:

import re

lst= ['REYNOLDS COMMUNITY CENTER/CENTRALE DE SOINS REYNOLDS',
      '100/10 COMMUNITY CENTER',
      'ROGERS COMMUNITY CENTER/CENTRAL CARE',
      'AB/CDE COMMUNITY CENTER']

pattern_slash_with_word_before_it = re.compile(r'(?i)^(.*? .*?)\/[^\d]')

for element in lst:
    if pattern_slash_with_word_before_it.search(element):
        print(pattern_slash_with_word_before_it.search(element)[1])
    else:
        print(element.replace('/', ' '))

Выходы:

REYNOLDS COMMUNITY CENTER
100 10 COMMUNITY CENTER
ROGERS COMMUNITY CENTER
AB CDE COMMUNITY CENTER 24

Это решение действительно учитывает только это является строкой с sla sh, но перед ней слова, или это не так, заменить косую черту пробелами. Может быть, это пища для размышлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...