python子字符串出现的位置_在负位置提前搜索在特定位置出现子字符串的字符串...

我只是在尝试创建一个正则表达式时遇到一个探查,它应该有助于查找包括子字符串的特定组合的字符串。

例如我正在搜索子字符串组合:

ab-ab-cd

1)“ xxxabxxxxxxabxxxxcdxxx”->应该匹配

2)“ xxxabxxxxabxxxxabxxxxcdxxxx->没有匹配项

3)“ xxxabxxxxxxxxxxcdxxxx->不匹配

使它更加复杂:

4)“ xxxabxxxxxabxxxxcdxxxabxxx->也应匹配

我的子字符串组合也可能是这样的:

A B C D

要么

Ab-ab-ab-cd

要么

ab-cd-ab-cd

对于所有这些(以及更多)示例,我正在寻找一种系统的方式以系统的方式构建相应的正则表达式,以便仅找到匹配的字符串,其中子字符串以正确的顺序和正确的频率出现。

对于“ ab-ab-cd”子字符串搜索,我得到了类似的内容,但是在示例4)的情况下却失败了。

p = re.compile("(?:(?!ab).)*ab.*?ab(?!.*ab).*cd",re.IGNORECASE)

在类似4)的情况下,此方法适用于,但也可以匹配类似2)的字符串:

p = re.compile("(?:(?!ab).)*ab(?:(?!ab).)*ab((?!ab|cd)*).*cd", re.IGNORECASE)

您能指出我的错误吗?

非常感谢!

编辑:

对不起,我的问题还不够清楚。我试图将我的问题分解为一个更简单的案例,这可能不是一个好主意。这里是问题的详细说明:

我列出了(蛋白质)序列,并根据序列模式为每个序列指定了特定的类型。

因此,我创建了一个字典,将类型名称作为键,并将特征模板(按特定顺序列出序列特征)作为值,例如:

type_a-> [A,A,B,C]

type_b-> [A,B,C]

type_c-> [A,B,A,B]

在其他字典中,我对每个功能都有(简单的)正则表达式模式,例如:

A-> [PHT] AG [QP] LI

B-> RS [TP] EV

C-> ...

D-> ...

现在,每个模板(type_a,type_b,...)我现在都要系统地构建级联的正则表达式模式(即,对于type_a,构建正则表达式以搜索A,A,B,C)。然后,这将导致另一个字典,类型为键,而完整的正则表达式为值。

现在,我想遍历序列列表中的每个序列,并针对每个序列映射所有完整的正则表达式模板。在最佳情况下,只有一个完整的正则表达式(类型)应与序列匹配。

从上面的示例开始,具有以下正则表达式模板:

光盘

A B C D

ab-ab-cd

Ab-ab-ab-cd

ab-cd-ab-cd

ab-ab-cd-ab

“ xxxabxxxxxxabxxxxcdxxx”

->此序列应与模板“ ab-ab-cd”的正则表达式匹配,而不与其他任何匹配

使用以下正则表达式,我可以完美地找到ab-ab-cd。

p = re.compile("(?:(?!ab).)*ab.*?ab(?!.*ab).*cd",re.IGNORECASE)

如果我的测试是正确的,它将仅匹配上面的序列1),而不匹配2)或3)。

但是,如果我要搜索ab-ab-cd-ab,则负向查找将不允许找到最后一个ab。我发现类似以下代码的内容可以打破第二个“ ab”部分之后的负面预测。以我的理解,否定的超前应该以“ cd”停止,以便最后的“ ab”可以再次匹配。

p = re.compile("(?:(?!ab).)*ab(?:(?!ab).)*ab((?!ab|cd)*).*cd", re.IGNORECASE)

它解决了ab-ab-cd-ab中最后一个“ ab”的问题。但是现在,它不但与“ cd”之前的2倍“ ab”匹配(序列1)-ab-ab-cd),而且还与“ cd”之前的3倍(ab)匹配(序列) 2,ab-ab-ab-cd),应该不要。

我希望我的问题更加清楚。非常感谢您提供所有答案,明天我将在工作时尝试使用该代码。任何进一步的答案都将受到高度赞赏,对正则表达式代码的解释(对正则表达式来说我还很陌生)以及使用re.functions(match,final ...)的建议。

谢谢

解决方案

为什么您需要负面的展望?为什么不使用那么简单的东西:

*ab.*ab.*cd

或者,如果您需要它从行的开头查找匹配项,则可以使用:

^.*ab.*ab.*cd

编辑:在您发表评论后,我了解了您的需求。试试这个:

^(?:(?!ab).)*ab(?:(?!ab).)*ab(?:(?!ab).)*cd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值