首页 > 解决方案 > 正则表达式和二元组

问题描述

要用空格替换标点符号,我使用:

import re
sentence = ...
output = re.sub(r'[^\w\s]', ' ', sentence)

我有两个问题:

  1. 我想将其更改为允许用连字符分隔的双字:例如"double-barreled"应该保留"double-barreled"而不是"double barreled"。实施此更改的最快方法是什么?

  2. 稍后,我想用空格替换任何既不包含字母也不包含数字的单词,也考虑双字。例如:

    "Tokyo2020">" "

    "covid-19">"covid-19"

    "cov!d-19">" "

    "Oompa-L00mpa">" "

    有什么聪明的方法可以用正则表达式来实现吗?

标签: pythonregexstring

解决方案


您可以使用否定前瞻来断言该单词不只包含数字或单词字符而不是数字和 _ 由连字符分隔的部分。

(?<!\S)(?!(?:\d+|[^\W\d_]+)(?:-(?:\d+|[^\W\d_]+))*(?!\S))\S+
  • (?<!\S)左边的空白边界
  • (?!负前瞻
    • (?:\d+|[^\W\d_]+)匹配没有数字的数字或单词字符,并且_
    • (?:非捕获组作为一个整体重复
      • -(?:\d+|[^\W\d_]+)匹配-和与以前相同的模式
    • )*关闭非捕获组并可选择重复
    • (?!\S)在右侧断言空白边界
  • )关闭前瞻
  • \S+匹配 1+ 个非空白字符

正则表达式演示| Python 演示

import re
 
pattern = r"(?<!\S)(?!(?:\d+|[^\W\d_]+)(?:-(?:\d+|[^\W\d_]+))*(?!\S))\S+"
 
s = ("Tokyo2020\n"
    "Tokyo!2020\n"
    "covid-19\n"
    "cov!d-19\n"
    "Oompa-L00mpa\n"
    "double-barreled\n"
    "double barreled\n"
    "test-t9")
 
result = re.sub(pattern, "[ ]", s)
print(result)

输出([ ]可以是空格)

[ ]
[ ]
covid-19
[ ]
[ ]
double-barreled
double barreled
[ ]

推荐阅读