我有一个遵循模式的字符串列表,这样在字符串中的某个位置可能有一个子字符串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
,如果是,请抓住最近的分隔符_
(或字符串的开头或结尾,如果更近)之间的所有内容?
您可以在此处使用正则表达式。您需要匹配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上使用您的测试用例进行正则表达式的在线演示