首页 > 解决方案 > Python如果字符串中存在子字符串,则在重新限制符之间获取其上下文

问题描述

我有一个遵循某种模式的字符串列表,这样在字符串的某个位置可能有一个 substring RAM。前任:

sdfjhsk_sdkjfhs_RAM_lkfdgjls

有时这个字符串后面可能有另一个字符。前任:

aaaa_RAMA_sfsffgd

我需要在最近的下划线之间有整个上下文,所以RAM在第一种情况下,RAMA在第二种情况下。

它甚至可能根本不存在于字符串 ex 中:

sfdks_sdfsdf_sdfsdf_sdfsdfsdf

允许在字符串的开头或结尾匹配:

RAMsdoa_saeorfioa_noutd  -> RAMsdoa
aetu_eaei_sdsdf_RAMSdoa  -> RAMsdoa

与没有下划线的字符串中的匹配一样:

sdasids -> nothing
sdfRAMso -> sdfRAMso

搜索字符串的最佳方法是什么,如果它包含模式RAM,如果包含,则抓取最近的分隔符_(或字符串的开头或结尾,如果更近)之间的所有内容?

标签: pythonregexsearchfind

解决方案


您可以在此处使用正则表达式。您需要匹配RAM,以及之前和之后的任何非_字符:

import re

def find_ram_context(inputtext):
    match = re.search(r'[^_]*RAM[^_]*', inputtext)
    if match:
        return match.group(0)

[^...]是负字符集匹配;不在该集合中的任何内容都会匹配。这里是_,*意味着应该有零个或多个这样的字符。因此,之前或之后RAM的任何不是下划线的字符都将被拉入匹配的文本中。

上面的函数返回匹配的上下文,或者None如果单词RAM不存在:

>>> find_ram_context('sdfjhsk_sdkjfhs_RAM_lkfdgjls')
'RAM'
>>> find_ram_context('aaaa_RAMA_sfsffgd')
'RAMA'
>>> find_ram_context('sfdks_sdfsdf_sdfsdf_sdfsdfsdf') is None
True

在https://regex101.com/r/6VcLrC/1上使用您的测试用例在线演示正则表达式


推荐阅读