Python:regex模式,用于在不存在后缀时提取前缀后的子字符串

2024-09-21 03:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从列表的每一项中提取子字符串。子字符串必须放在'opt_'前缀之后,并且字符串中不能有'_join'后缀

我的意见:

my_opts = [
    'opt_tw',
    'opt_ls_join',
    'opt_ac_join',
    'opt_pan_join',
    'opt_full_led',
]

期望输出:

['tw', 'full_led']

我所尝试的:

>>> import re
>>> pattern = r'opt_?(.*)[^_join]'
>>> print([
...     re.search(pattern, opt).group(1)
...     for opt in my_opts
...     if re.match(pattern, opt)
... ])
['t', 'l', 'a', 'p', 'full_le']

你能帮帮我吗


Tags: 字符串re列表ledmy后缀lsac
2条回答

您可以使用^{}^{}作为捕获组的条件和字符串切片:

out = [opt[4:]
       for opt in my_opts
       if opt.startswith("opt_") and not opt.endswith("_join")]

其中4等于"opt_"的长度,并有助于在该长度之后获得子字符串

得到

>>> out
["tw", "full_led"]

您可以匹配_opt,也可以选择匹配直到最后一次出现_

然后在字符串末尾断言notjoin,并在组1中捕获其余部分

opt_((?:.*_)?(?!join$)[^\r\n_]+)$
  • opt_逐字匹配
  • (捕获组1
    • (?:.*_)?可以选择匹配,直到最后一次出现_
    • (?!join$)负前瞻,在字符串末尾断言not join
    • [^\r\n_]+匹配1+乘以除_(或换行符)以外的任何字符
  • )关闭组1
  • $字符串的结尾

REgex demo

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))

输出

tw
full_led

如果字符串不应包含_join,则可以使用负前瞻

^opt_(?!.*_join)(.+)

Regex demo

相关问题 更多 >

    热门问题