Skip to content

Instantly share code, notes, and snippets.

@pmeier
Last active November 29, 2024 13:42
Show Gist options
  • Save pmeier/0e8459f8a5ad7ce5395fff8c73c66b7d to your computer and use it in GitHub Desktop.
Save pmeier/0e8459f8a5ad7ce5395fff8c73c66b7d to your computer and use it in GitHub Desktop.
Convert any* string to kebab-case or snake_case
import re
def delimited_case(s: str, *, delimiter: str) -> str:
return re.sub(
r"(([a-z0-9])(?=[A-Z][a-zA-Z0-9])|([A-Z0-9])(?=[A-Z0-9][a-z]))",
rf"\1{delimiter}",
re.sub(r"[^a-zA-Z0-9]+", delimiter, s),
)
def kebab_case(s: str) -> str:
return delimited_case(s, delimiter="-").lower()
def snake_case(s: str) -> str:
return delimited_case(s, delimiter="_").lower()
def screaming_case(s: str) -> str:
return delimited_case(s, delimiter="_").upper()
print("| `s` | `kebab_case(s)` | `screaming_case(s)` |")
print("|-----|-----------------|-----------------|")
for s in [
"kebab-case",
"snake_case",
"PascalCase",
"PascalCaseWithURL",
"PascalCaseWithURLInTheMiddle",
"camelCase",
"camelCaseWithS3Bucket",
"separate words with S3Bucket",
"Really_weird-mixOfDifferent.cases",
]:
print(f"| {s} | {kebab_case(s)} | {screaming_case(s)} |")
@pmeier
Copy link
Author

pmeier commented Nov 29, 2024

s kebab_case(s) screaming_case(s)
kebab-case kebab-case KEBAB_CASE
snake_case snake-case SNAKE_CASE
PascalCase pascal-case PASCAL_CASE
PascalCaseWithURL pascal-case-with-url PASCAL_CASE_WITH_URL
PascalCaseWithURLInTheMiddle pascal-case-with-url-in-the-middle PASCAL_CASE_WITH_URL_IN_THE_MIDDLE
camelCase camel-case CAMEL_CASE
camelCaseWithS3Bucket camel-case-with-s3-bucket CAMEL_CASE_WITH_S3_BUCKET
separate words with S3Bucket separate-words-with-s3-bucket SEPARATE_WORDS_WITH_S3_BUCKET
Really_weird-mixOfDifferent.cases really-weird-mix-of-different-cases REALLY_WEIRD_MIX_OF_DIFFERENT_CASES

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment