【问题标题】:?= and ?P combined in a regex?= 和 ?P 组合在一个正则表达式中
【发布时间】:2016-07-09 22:23:36
【问题描述】:

简而言之: 我想在 Python 中使用Lookahead 技术和?P<name> 约定(详细信息here)来按名称获取组。

更多详情:

我发现了 Lookahead 技巧here;例如以下正则表达式...

/^(?=.*Tim)(?=.*stupid).+

... 允许检测像"Tim stupid""stupid Tim" 这样的字符串,顺序并不重要。

我不知道如何将?=“运算符”与?P 结合起来;以下正则表达式 显然 不能解决问题,但可以了解我想要什么:

/^(?=?P<word1>.*Tim)(?=?P<word2>.*stupid).+

【问题讨论】:

标签: python regex


【解决方案1】:

正则表达式中的?P&lt;word1&gt; 让人想起named capture group

命名组的语法是 Python 特定的扩展之一:(?P&lt;name&gt;...)*name* 显然是该组的名称。命名组的行为也与捕获组完全一样,并且还将名称与组相关联。

所以,很可能您正在寻找一种方法来捕获子字符串,该方法是在开始时锚定的正向前瞻中要求字符串满足两种模式,并在两个前瞻中捕获子字符串:

^(?=(?P<word1>.*Tim))(?=(?P<word2>.*stupid)).+
    ^^^^^^^^^^     ^    ^^^^^^^^^^        ^ 

regex demo

请注意,如果您不需要字符串本身,.+ 是多余的,可以删除。如有必要,您可能需要重新调整命名捕获组的边界。

【讨论】:

  • 更准确地说(?):^(?=.*(?P&lt;word1&gt;Tim))(?=.*(?P&lt;word2&gt;stupid)).+
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2020-01-29
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多