regex - 正则表达式与 Python 3 匹配以下划线开头和结尾的单词
问题描述
我有以下示例代码,我试图匹配所有以下划线开头和结尾的单词实例(单或双)。
import re
test = ['abc text_ abc',
'abc _text abc',
'abc text_textUnderscored abc',
'abc :_text abc',
'abc _text_ abc',
'abc __text__ abc',
'abc _text_: abc',
'abc (-_-) abc']
test_str = ' '.join(test)
print(re.compile('(_\\w+\\b)').split(test_str))
我已经尝试过以下正则表达式,它似乎太强大了(应该只匹配_text_
and __text__
)。
输出:['abc text_ abc abc ', '_text', ' abc abc text', '_textUnderscored', ' abc abc :', '_text', ' abc abc ', '_text_', ' abc abc ', '__text__', ' abc abc ', '_text_', ': abc abc (-_-) abc']
你能建议一个更好的方法(最好是单一的正则表达式模式和re.split
方法的使用)?
解决方案
如果您的意思是匹配任何非单词字符(字母、数字和下划线以外的字符)和任何长度(甚至是 1、_
)的单词字符(字母、数字和下划线)块(字母、数字和下划线),您可以使用
r'\b_(?:\w*_)?\b'
与re.findall
. 请参阅正则表达式演示。
如果您不想匹配单字符词(即_
),则需要删除可选的非捕获组,并使用r'\b_\w*_\b'
.
如果您需要匹配至少 3 个字符单词,也将*
(零次或多次重复) 替换为+
(一次或多次出现) 。
如果仅当单词位于字符串的开头/结尾或后面/前面有空格时才将单词视为整个单词,请替换\b...\b
为(?<!\S)...(?!\S)
:
r'(?<!\S)_\w*_(?!\S)'
细节
\b
- 单词边界,之前必须有字符串开头或非单词字符_
- 一个下划线(?:\w*_)?
- 一个可选的非捕获组匹配 1 或 0 次出现\w*
- 0+ 单词字符(字母、数字、_
s)(感谢这个可选组,甚至_
可以找到单词)_
- 一个下划线
\b
- 单词边界,后面必须有字符串结尾或非单词字符(?<!\S)
- 左空白边界(?!\S)
- 右空白边界
请参阅Python 演示:
rx = re.compile(r'\b_(?:\w*_)?\b')
print(rx.findall(test_str))
# => ['_text_', '__text__']
推荐阅读
- scala - Avro 通用记录未考虑别名
- javascript - 当用户尝试移出角度 6 中的任何组件时如何提示用户
- javascript - Angular 5子组件公开属性但不公开方法
- accessibility - 让屏幕阅读器说按钮 alt-attribute 而不是 innerText
- c# - 错误:cs0131 赋值的左侧必须是变量、属性或索引器
- r - 运行时可自定义设置
- amazon-web-services - AWS S3 存储桶策略安全性
- php - PHP 切换语法
- javascript - 如何使用角度删除使用嵌套循环的表行
- excel - VSTS 代理从 Powershell 运行的 Excel 因未知原因而失败