Как отделить строку в неправильном регистре, чтобы получить слова? - питон
У меня есть следующий список слов.
как мои слова не все отграничены капиталом последнего. список слов будет состоять из таких слов, как "США", я не уверен, как это сделать. "США" должно быть как одно слово. не может быть отделен
myList=[u'USA',u'Chancellor', u'currentRank', u'geolocDepartment', u'populationUrban', u'apparentMagnitude', u'Train', u'artery',
u'education', u'rightChild', u'fuel', u'Synagogue', u'Abbey', u'ResearchProject', u'languageFamily', u'building',
u'SnookerPlayer', u'productionCompany', u'sibling', u'oclc', u'notableStudent', u'totalCargo', u'Ambassador', u'copilote',
u'codeBook', u'VoiceActor', u'NuclearPowerStation', u'ChessPlayer', u'runwayLength', u'horseRidingDiscipline']
Как редактировать элемент в списке.
Я хотел бы изменить элемент в списке, как показано ниже:
updatemyList=[u'USA',u'Chancellor', u'current Rank', u'geoloc Department', u'population Urban', u'apparent Magnitude', u'Train', u'artery',
u'education', u'right Child', u'fuel', u'Synagogue', u'Abbey', u'Research Project', u'language Family', u'building',
u'Snooker Player', u'production Company', u'sibling', u'oclc', u'notable Student', u'total Cargo', u'Ambassador', u'copilote',
u'code Book', u'Voice Actor', u'Nuclear Power Station', u'Chess Player', u'runway Length', u'horse Riding Discipline']
слово может отделить
5 ответов
Вы можете использовать re.sub
import re
first_cap_re = re.compile('(.)([A-Z][a-z]+)')
all_cap_re = re.compile('([a-z0-9])([A-Z])')
def convert(word):
s1 = first_cap_re.sub(r'\1 \2', word)
return all_cap_re.sub(r'\1 \2', s1)
updated_words = [convert(word) for word in myList]
Адаптировано из: Элегантная функция Python для преобразования CamelCase в snake_case?
Можете ли вы просто проверить, являются ли все буквы в слове заглавными буквами, и если да, игнорировать их, то есть считать их одним словом?
Я использовал подобный код в прошлом, и он выглядит немного жестко, но он делает свою работу правильно (в моем случае я хотел захватывать сокращения длиной до 4 букв)
def CapsSumsAbbv():
for word in words:
for i,l in enumerate(word):
try:
if word[i] == word[i].upper() and word[i+1] == word[i+1].upper() and word[i+2] == word[i+2].upper() and word[i+3] == word[i+3].upper():
try:
word = int(word)
except:
if word not in allcaps:
allcaps.append(word)
except:
pass
Для дальнейшего расширения, если у вас были записи, такие как u'USAMilitarySpending'
Вы можете адаптировать приведенный выше код так, чтобы, если в строке было больше двух букв, но были и нижние, между ними добавлялся пробел. last
а также last-1
заглавные буквы, так что становится u'USA Military Spending'
Вы можете использовать регулярное выражение для добавления каждой буквы в верхнем регистре, которая не находится в начале слова, с пробелом:
re.sub(r"(?!\b)(?=[A-Z])", " ", your_string)
Бит в первой паре слов означает "не в начале слова", а бит во второй паре означает "за ним следует заглавная буква". Регулярное выражение сопоставляет пустую строку в местах, где выполняются эти два условия, и заменяет пустую строку пробелом, т. Е. Вставляет пробел в эти позиции.
Можно сделать это с помощью регулярных выражений, но легче понять с помощью небольшого алгоритма (игнорируя угловые случаи, такие как сокращения, например, NLTK)
def split_camel_case(string):
new_words = []
current_word = ""
for char in string:
if char.isupper() and current_word:
new_words.append(current_word)
current_word = ""
current_word += char
return " ".join(new_words + [current_word])
old_words = ["HelloWorld", "MontyPython"]
new_words = [split_camel_case(string) for string in old_words]
print(new_words)
Следующий фрагмент кода разделяет слова так, как вы хотите:
myList=[u'Chancellor', u'currentRank', u'geolocDepartment', u'populationUrban', u'apparentMagnitude', u'Train', u'artery', u'education', u'rightChild', u'fuel', u'Synagogue', u'Abbey', u'ResearchProject', u'languageFamily', u'building', u'SnookerPlayer', u'productionCompany', u'sibling', u'oclc', u'notableStudent', u'totalCargo', u'Ambassador', u'copilote', u'codeBook', u'VoiceActor', u'NuclearPowerStation', u'ChessPlayer', u'runwayLength', u'managerYearsEndYear', 'horseRidingDiscipline']
updatemyList = []
for word in myList:
phrase = word[0]
for letter in word[1:]:
if letter.isupper():
phrase += " "
phrase += letter
updatemyList.append(phrase)
print updatemyList