您好,登錄后才能下訂單哦!
今天小編給大家分享一下Python怎么實現分割單詞和轉換命名的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
將一個標識符分割成若干單詞存進列表,便于后續命名法的轉換
先引入正則表達式包
import re
至于如何分割單詞看個人喜好,如以常見分隔符 “ ”、“_”、“-”、“/”、“\” 去分割
re.split('[ _\-/\\\\]+', name)
還可以范圍再廣一點,拿除了數字和字母以外的所有字符去分割
re.split('[^0-9a-zA-Z]', name)
那對于字母內部怎么分割呢?
綜合考慮駝峰命名法、連續大寫的縮寫單詞等,筆者根據經驗一般會采用這種策略,連續比較三個字符,滿足以下條件之一就分割:“小|大無”、“有|大小”、“小|大有”
是尾字符,是大寫,倒數第二個字符是小寫,在尾字符前分割,比如 'getA' 分割成 ['get','A']
是非首位的中間字符,是大寫,前后至少有一個是小寫,在該字符前分割,比如 'getJSONString' 分割成 ['get','JSON','String']
對于字母和數字結合的標識符,就比較難處理了
因為有的數字可以作為單詞開頭(比如 '3D'),有的又可以作為結尾(比如 'HTML5'),還有的字母數字交錯(比如 'm3u8'),暫未想到通用的分割的好辦法,根據個人需求實現就行了
綜合以上幾者的分割函數如下
def to_words(name): words = [] # 用于存儲單詞的列表 word = '' # 用于存儲正在構建的單詞 if(len(name) <= 1): words.append(name) return words # 按照常見分隔符進行分割 # name_parts = re.split('[ _\-/\\\\]+', name) # 按照非數字字母字符進行分割 name_parts = re.split('[^0-9a-zA-Z]', name) for part in name_parts: part_len = len(part) # 字符串的長度 word = '' # 如果子串為空,繼續循環 if not part: continue for index, char in enumerate(part): # “小|大無” if(index == part_len - 1): if(char.isupper() and part[index-1].islower()): if(word): words.append(word) words.append(char) word = '' continue # “有|大小”或“小|大有” elif(index != 0 and char.isupper()): if((part[index-1].islower() and part[index+1].isalpha()) or (part[index-1].isalpha() and part[index+1].islower())): if(word): words.append(word) word = '' word += char if(len(word) > 0): words.append(word) # 去除空單詞 return [word for word in words if word != '']
測試用例如下
print(to_words('IDCard')) # ['ID', 'Card'] print(to_words('getJSONObject')) # ['get', 'JSON', 'Object'] print(to_words('aaa@bbb.com')) # ['aaa', 'bbb', 'com'] print(to_words('D://documents/data.txt')) # ['D', 'documents', 'data', 'txt']
def to_lower_words(name): words = to_words(name) return [word.lower() for word in words]
def to_upper_words(name): words = to_words(name) return [word.upper() for word in words]
def to_capital_words(name): words = to_words(name) return [word.capitalize() for word in words]
中劃線命名法,也叫烤肉串命名法(kebab case),如 'kebab-case'
字母全小寫
連字符連接
def to_kebab_case(name): words = to_lower_words(name) to_kebab_case = '-'.join(words) return to_kebab_case
小蛇式命名法,其實就是小寫下劃線命名法,也叫蛇式命名法(snake case),如 'snake_case'
字母全小寫
下劃線連接
def to_snake_case(name): words = to_lower_words(name) snake_case_name = '_'.join(words) return snake_case_name
大蛇式命名法,其實就是大寫下劃線命名法,也叫宏命名法(macro case),如 'MACRO_CASE'
字母全大寫
下劃線連接
def to_macro_case(name): words = to_upper_words(name) snake_case_name = '_'.join(words) return snake_case_name
小駝峰命名法,也叫駝峰命名法(camel case) ,如 'camelCase'
首單詞首字母小寫,后每個單詞首字母大寫
不使用連接符
def to_camel_case(name): words = to_words(name) camel_case_words = [] for word in words: if len(word) <= 1: camel_case_words.append(word.upper()) else: camel_case_words.append(word[0].upper() + word[1:]) camel_case = ''.join(camel_case_words) if len(camel_case) <= 1: camel_case = camel_case.lower() else: camel_case = ''.join(camel_case[0].lower() + camel_case[1:]) return camel_case
大駝峰命名法,也叫帕斯卡命名法(pascal case) ,如 'PascalCase'
每個單詞首字母大寫
不使用連接符
def to_pascal_case(name): words = to_words(name) pascal_case_words = [] for word in words: if len(word) <= 1: pascal_case_words.append(word.upper()) else: pascal_case_words.append(word[0].upper() + word[1:]) pascal_case = ''.join(pascal_case_words) return pascal_case
以上就是“Python怎么實現分割單詞和轉換命名”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。