Sử dụng regex (re module) để chèn dấu gạch dưới trước các chữ hoa và chuyển toàn bộ thành chữ thường.
Code
import re
def convert(name):
# Chèn _ trước chữ hoa theo sau chữ thường/số: JavaBeans -> Java_Beans
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
# Chèn _ trước chữ hoa theo sau chữ thường/số: Java_Beans -> Java_Beans (đã xong)
# Xử lý trường hợp liên tiếp: XMLParser -> X_M_L_Parser -> xml_parser
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
print(convert('JavaBeans')) # java_beans
print(convert('JavaStrutsSwing')) # java_struts_swing
print(convert('XMLHttpRequest')) # x_m_l_http_request
Đầu ra
java_beans java_struts_swing x_m_l_http_request
Giải thích regex
(.)([A-Z][a-z]+): Tìm ký tự bất kỳ theo sau bởi chữ hoa + chữ thường (ví dụ:aBtrongJavaBeans->a_B).([a-z0-9])([A-Z]): Tìm chữ thường/số theo sau bởi chữ hoa (xử lý chữ viết tắt nhưXML)..lower(): Chuyển toàn bộ thành chữ thường.
Lưu ý: Với từ viết tắt liên tiếp (XML, HTTP), kết quả sẽ tách từng chữ cái. Có thể cải tiến regex nếu muốn giữ nguyên từ viết tắt.