python - 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
,如果包含,则抓取最近的分隔符_
(或字符串的开头或结尾,如果更近)之间的所有内容?
解决方案
您可以在此处使用正则表达式。您需要匹配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上使用您的测试用例在线演示正则表达式
推荐阅读
- python - Python2打印postgresql存储过程引发通知
- python - AttributeError:“pygame.Rect”对象没有属性“up”和“down”
- machine-learning - 属性缩减与维度缩减
- css - 更少的继承不起作用
- python - 如果 elif else db 更新脚本,python3 的更好方法
- angularjs - 如何仅对 ag 网格中的某些行禁用编辑
- javascript - React - 将 Active 类添加到列表项 react-router
- c - 使用 libinput 获取原始多点触控数据
- php - 如何在 PHP 扩展中获取当前请求 URL(用于 HTTP)或脚本路径 (CLI)?
- node.js - 如何将 HTTP/2 与 Nest.js(节点)一起使用