繁体   English   中英

只有在特定字符出现之前才会匹配char(条件正则表达式)

[英]regex matching char only if a specific char appeared before (conditional regex)

开发移动(以色列)电话号码正则表达式。 目前我有

re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')

它捕获了大多数用例。 只有出现第一个括号时,问题才在于匹配第二个括号。

所以(055)-5555555或(055)5555555或0555555555匹配但是:055)-5555555不会。 我知道我可以使用2个正则表达式来测试条件(如果第一个匹配测试另一个条件),但这似乎不是一个聪明的解决方案。

我想我需要像正则表达式的外观,但不知道如何使用它,或者我正确理解这个概念

编辑:解释逻辑

区号:应以5开头,然后是单个数字(来自特定列表),之前选项为零。 也可能在括号内。 然后是一个可选的连字符和7位数字

澄清:我需要匹配两个括号只有当另一个存在时,对于第一个也是如此,不仅对于第二个,也错过了这一点

首先,您必须捕获左括号,然后使用条件模式我知道链接是php.net,但我发现它在引用正则表达时很有用,它还包括一个与您的情况完全匹配的示例 ),只有在第一个左括号匹配。

模式..

^(\()?0?(5[02-9])(?(1)\))-?(\d{7})$

匹配

(055)-5555555
(055)5555555 
0555555555

不是

055)-5555555

捕获的团体

  1. 左括号(如果没有找到则为空)
  2. 区号(例如55)
  3. 电话号码(例如5555555)

这个怎么运作

部分(\\()?匹配左括号。它是可选的。

部分(?(1)\\))检查第一个捕获的组(在我们的例子中是左括号)是否匹配,如果是,则字符串也必须与右括号匹配。

如果未找到左括号,则实际上忽略该条件。

仅当开头画面匹配时,才使用(?(id/name)yes-pattern|no-pattern)语法匹配右括号:

re.compile(r'^(\()?0?(5[023456789])(?(1)\))-?\d{7}$')

(?(1)\\))部分匹配\\)如果有一个基团1( |无图案是可选的)。

演示:

>>> phone.search('(055)-5555555')
<_sre.SRE_Match object at 0x101e18a48>
>>> phone.search('055)-5555555') is None
True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM