擅长:python、mysql、java
<p>您可以匹配<code>_opt</code>,也可以选择匹配直到最后一次出现<code>_</code></p>
<p>然后在字符串末尾断言not<code>join</code>,并在组1中捕获其余部分</p>
<pre><code>opt_((?:.*_)?(?!join$)[^\r\n_]+)$
</code></pre>
<ul>
<li><code>opt_</code>逐字匹配</li>
<li><code>(</code>捕获<strong>组1</strong>
<ul>
<li><code>(?:.*_)?</code>可以选择匹配,直到最后一次出现<code>_</code></li>
<li><code>(?!join$)</code>负前瞻,在字符串末尾断言not join</li>
<li><code>[^\r\n_]+</code>匹配1+乘以除<code>_</code>(或换行符)以外的任何字符</li>
</ul>
</li>
<li><code>)</code>关闭组1</li>
<li><code>$</code>字符串的结尾</li>
</ul>
<p><a href="https://regex101.com/r/iCqrUo/1" rel="nofollow noreferrer">REgex demo</a></p>
<pre><code>import re
my_opts = [
'opt_tw',
'opt_ls_join',
'opt_ac_join',
'opt_pan_join',
'opt_full_led',
]
pattern = r"opt_((?:.*_)?(?!join$)[^\r\n_]+)$"
for s in my_opts:
match = re.match(pattern, s)
if match:
print(match.group(1))
</code></pre>
<p>输出</p>
<pre><code>tw
full_led
</code></pre>
<p>如果字符串不应包含<code>_join</code>,则可以使用负前瞻</p>
<pre><code>^opt_(?!.*_join)(.+)
</code></pre>
<p><a href="https://regex101.com/r/C8pHp7/1" rel="nofollow noreferrer">Regex demo</a></p>