Разделение предложения, когда нижний и верхний регистры объединены - PullRequest
1 голос
/ 03 октября 2019

У меня есть список предложений , где нижний регистр слова соединяется с верхним регистром следующего слова, например «AvailableIndoor», как показано ниже:

'Full Bar Available  Valet Parking AvailableIndoor SeatingWifiTable reservation required'

Iхотите разделить в этих экземплярах и заменить его на двойной пробел ("") что-то вроде этого

'Full Bar Available  Valet Parking Available  Indoor Seating  Wifi  Table reservation required'

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

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

import re

s = 'Full Bar Available  Valet Parking AvailableIndoor SeatingWifiTable reservation required'
res = re.sub(r'([a-z])([A-Z])', r'\1  \2', s)
print(res)
  • \1 и \2 - ссылка на соответствующие захваченные группы (([a-z]) и ([A-Z]))

Выход:

Full Bar Available  Valet Parking Available  Indoor Seating  Wifi  Table reservation required
0 голосов
/ 03 октября 2019

Подстановка регулярных выражений - это одно, но если вы не понимаете регулярное выражение, есть способ сделать это без импорта каких-либо библиотек. Возможно, это не самый эффективный способ, но он работает.

s = 'Full Bar Available  Valet Parking AvailableIndoor SeatingWifiTable reservation required'
fin = []
i = 1 # We want to start from 1 due to how our if condition is structured
fin.append(s[0]) # Since we're starting from the 1st (not 0th) position, we have 
                 # to manually add it to our final list outside of the loop

while i < len(s): # len(s) to check over the entire length of the string
    if s[i].istitle() and not s[i-1].istitle() and s[i-1] != ' ':
    # If the previous letter was lower case and the current one is upper case,
    # and also the previous isn't a space, we separate them by 2 spaces
        fin.append("  ")
        fin.append(s[i])
        i += 1
    else:
        fin.append(s[i])
        i += 1

print(''.join(fin)) # This just joins all the elements of our list 'fin' into 
                    #one, without any additional characters between each element

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

0 голосов
/ 03 октября 2019

Альтернатива re.findall решение:

import re
s = 'Full Bar Available  Valet Parking AvailableIndoor SeatingWifiTable reservation required'
new_s = '  '.join(re.findall('[A-Z][a-z]+|[a-z]+', s))

Вывод:

'Full  Bar  Available  Valet  Parking  Available  Indoor  Seating  Wifi  Table  reservation  required'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...