Есть ли способ обнаруживать слова без поиска пробелов или подчеркиваний

#python #conventions #pep8

#питон #условные обозначения #pep8

Вопрос:

Я пытаюсь написать CLI для генерации классов python. Часть этого требует проверки идентификаторов, предоставленных при вводе пользователем, а для python для этого требуется убедиться, что идентификаторы соответствуют рекомендациям / стандартам pep8 для идентификаторов — классы с заглавными буквами, поля с all_lowercase_with_underscores, пакеты и модули с so on so четвертый-

 # it is easy to correct when there is a identifier
# with underscores or whitespace and correcting for a class

def package_correct_convention(item):
    return item.strip().lower().replace(" ","").replace("_","")
 

Но когда между токенами нет пробелов или подчеркиваний, я не уверен, как правильно использовать первую букву каждого слова в идентификаторе с заглавной буквы. Можно ли реализовать что-то подобное без использования искусственного интеллекта или чего-то подобного:

скажем, например:

 # providing "ClassA" returns "classa" because there is no delimiter between "class" and "a"
def class_correct_convention(item):
    if item.count(" ") or item.count("_"):
        # checking whether space or underscore was used as word delimiter.
        if item.count(" ") > item.count("_"):
            item = item.split(" ")
        elif item.count(" ") < item.count("_"):
            item = item.split("_")
        item = list(map(lambda x: x.title(), item))
        return ("".join(item)).replace("_", "").replace(" ","")
    # if there is no white space, best we can do it capitalize first letter 
    return item[0].upper()   item[1:]
 

Комментарии:

1. Предоставление ClassA фактической отдачи ClassA . Можете ли вы привести наглядный пример (или несколько примеров, проясняющих проблему) с ожидаемым результатом и тем, чем он отличается от фактического результата? Кроме того, очевидно, что должен быть какой -то отличительный знак, например, заглавная буква. В конце концов, действительно ли «classa» — это «ClassA» или автор имел в виду «ClassA» или «Classa» (на каком бы языке это ни означало что-то)?

2. Вам в основном нужен токенизатор и словарь принятых слов. И ему нужно вернуться назад. И это всегда будет эвристическим, потому что существуют допустимые строки, которые обозначают более одного способа, например hislap , предполагается обозначить как hiSlap или hisLap ? Примечание: Python уже предоставляет str.capitalize str.title методы and, которые выполняют за вас большую часть работы, поэтому вы можете захотеть изучить их.

Ответ №1:

Что ж, при подходе, основанном на ИИ, это будет сложно, не идеально, много работы. Если это того не стоит, возможно, есть более простой и, безусловно, сравнительно эффективный.

Я понимаю, что худший сценарий "todelineatewordsinastringlikethat" .

Я бы рекомендовал вам загрузить текстовый файл для английского языка, по одному слову в строке, и продолжить таким образом:

 import re

string = "todelineatewordsinastringlikethat" 

#with open("mydic.dat", "r") as msg:
#    lst = msg.read().splitlines()

lst = ['to','string','in'] #Let's say the dict contains 3 words

lst = sorted(lst, key=len, reverse = True)

replaced = []

for elem in lst:

    if elem in string: #Very fast
        replaced_str = " ".join(replaced) #Faster to check elem in a string than elem in a list
        capitalized = elem[0].upper() elem[1:] #Prepare your capitalized word

        if elem not in replaced_str: #Check if elem could be a substring of something you replaced already
            string = re.sub(elem,capitalized,string) 

        elif elem in replaced_str: #If elem is a sub of something you replaced, you'll protect
            protect_replaced = [item for item in replaced if elem in item] #Get the list of replaced items containing the substring elem

            for protect in protect_replaced: #Uppercase the whole word to protect, as we do a case sensitive re.sub()
                string = re.sub(protect,protect.upper(),string)

            string = re.sub(elem,capitalized,string)

            for protect in protect_replaced: #Deprotect by doing the reverse, full uppercase to capitalized
                string = re.sub(protect.upper(),protect,string)

        replaced.append(capitalized) #Append replaced element in the list
        
print (string)
 

Вывод:

 TodelIneatewordsInaStringlikethat
#You see that String has been protected but not delIneate, cause it was not in our dict.
 

Это, конечно, не оптимально, но, безусловно, будет работать сопоставимо с ИИ для задачи, которая, безусловно, не будет представлена так, как она есть для ИИ в любом случае (подготовка к вводу очень важна в ИИ).

Обратите внимание, что важно выполнить обратную сортировку списка слов. Потому что вы хотите сначала обнаружить полные строковые слова, а не вложенные. Например, в beforehand «ты хочешь полный, а не before или and » .