我有以下示例代码,我试图匹配所有以 开头的单词实例和结尾 带下划线(单条或双条)。
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_
和 __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
.见 regex demo .如果您不想匹配单字符单词(即
_
),您需要删除可选的非捕获组,并使用 r'\b_\w*_\b'
.如果您需要匹配至少 3 个字符单词,请同时替换
*
(零次或多次重复)与 +
(出现一次或多次)。如果您仅在字符串的开头/结尾或后面/前面有空格时才将单词视为整个单词,请替换
\b...\b
与 (?<!\S)...(?!\S)
:r'(?<!\S)_\w*_(?!\S)'
见 another regex demo
详情
\b
- 单词边界,必须在 _
- 下划线 (?:\w*_)?
- 一个可选的非捕获组匹配 1 或 0 次出现\w*
- 0+ 字字符(字母、数字、_
s)(感谢这个可选组,甚至会找到 _
字)_
- 下划线 \b
- 一个单词边界,在(?<!\S)
- 左空白边界 (?!\S)
- 右空白边界 见 Python demo :
rx = re.compile(r'\b_(?:\w*_)?\b')
print(rx.findall(test_str))
# => ['_text_', '__text__']
关于正则表达式与 Python 3 匹配以下划线开头和结尾的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55011380/