正则表达式与 Python 3 匹配以下划线开头和结尾的单词

标签 regex python-3.x

我有以下示例代码,我试图匹配所有以 开头的单词实例和结尾 带下划线(单条或双条)。

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/

    相关文章:

    python-3.x - firebase_admin auth.verify_id_token 很慢

    c# - .NET 正则表达式查询仅查找一个新行

    javascript 替换为具有特定 id 的正则表达式 img 标记,但其他属性可以是任何内容

    python - 将订单号与字母字符和数字的组合相匹配?

    javascript - 有没有更好的方法从字符串中提取信息?

    python - 需要处理具有非唯一多索引的串联数据帧

    python - 如何在函数中键入默认列表初始值设定项

    python-3.x - 在Python中解析多个xml文件

    python - 从 gzip 文件写入未压缩文件的内存有效方法

    java - java中的模式匹配: extracting digits from a string literal