首页 > 解决方案 > Python REGEX,重新格式化字符串

问题描述

我正在尝试创建一个正则表达式,它将接受一个字符串并替换某些字符

  1. 两个或多个空格减少为一个空格
  2. 以下字符将被替换为单词:“#”->“数字”、“@”->“at”
  3. 空格将被替换为“-”,除非它位于字符串的末尾
  4. 仅包含 az、AZ、0-9 和:!@#$%&/,
  5. 双倍或更多“-”将减少为一个
"Hello, Wor--ld! 1$2@3-   " -> "hello-wor-ld-1-dollars-2-at-3"

我的代码:

name = "Hello, World! 1$2@3-   "

name = re.sub("[^a-zA-Z0-9]+","-",name.lower())

print(name)

但它会导致“hello-world-1-2-3-”

标签: pythonregex

解决方案


以下是您可以用作解决问题的基础的代码:

import re
name = "Hello, World! 1$2@3-   "
name = re.sub("[^a-zA-Z0-9@#$&]+", "-", " ".join(name.lower().split()))
dct = {'#': 'number', '@': 'at', '$': 'dollars', '&': 'and'}
name = re.sub(r'[$@#]', lambda x: f"-{dct[x.group()]}-", name)
print(name.strip('-'))
# => hello-world-1-dollars-2-at-3

请参阅Python 演示

笔记:

  • " ".join(name.lower().split())- 删除前导/尾随空格,将多个空格缩小到单词之间的一次出现并用空格分割
  • re.sub("[^a-zA-Z0-9@#$&]+", "-", ...)#- 用连字符替换除字母数字、、、@和字符之外$的所有一个或多个连续字符&
  • re.sub(r'[$@#]', lambda x: f"-{dct[x.group()]}-", name)- 用单词替换指定的特殊字符
  • name.strip('-')删除前导/尾随连字符。

推荐阅读