python - 正则表达式和二元组
问题描述
要用空格替换标点符号,我使用:
import re
sentence = ...
output = re.sub(r'[^\w\s]', ' ', sentence)
我有两个问题:
我想将其更改为允许用连字符分隔的双字:例如
"double-barreled"
应该保留"double-barreled"
而不是"double barreled"
。实施此更改的最快方法是什么?稍后,我想用空格替换任何既不包含字母也不包含数字的单词,也考虑双字。例如:
"Tokyo2020"
>" "
"covid-19"
>"covid-19"
"cov!d-19"
>" "
"Oompa-L00mpa"
>" "
有什么聪明的方法可以用正则表达式来实现吗?
解决方案
您可以使用否定前瞻来断言该单词不只包含数字或单词字符而不是数字和 _ 由连字符分隔的部分。
(?<!\S)(?!(?:\d+|[^\W\d_]+)(?:-(?:\d+|[^\W\d_]+))*(?!\S))\S+
(?<!\S)
左边的空白边界(?!
负前瞻(?:\d+|[^\W\d_]+)
匹配没有数字的数字或单词字符,并且_
(?:
非捕获组作为一个整体重复-(?:\d+|[^\W\d_]+)
匹配-
和与以前相同的模式
)*
关闭非捕获组并可选择重复(?!\S)
在右侧断言空白边界
)
关闭前瞻\S+
匹配 1+ 个非空白字符
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
[ ]
推荐阅读
- javascript - 第一个参数必须是字符串类型或缓冲区或 uint8array 的实例。收到未定义
- oracle - 如何在 SQLDeveloper 中处理一组脚本的执行
- itext7 - 删除任何间距、填充和边距,以便单元格完全用 iText 7 填充
- c++ - 具有完全自定义类型的特征稀疏矩阵乘法
- java - 无法从谷歌驱动器上的 java 中找到新创建的电子表格
- database - @OneToOne 还是 @ManyToOne?
- react-native - 使用反应导航实现加载屏幕的最佳方法是什么(我想在显示导航之前将数据加载到上下文中
- java - 如何对输入数据进行循环然后对所有值求和而不覆盖第一个输入
- r - 按列随机化数据表而不丢失属性或更改类型
- mysql - 将两个视图合二为一?