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

时间:2013-03-09 09:29:15

标签: python regex regex-lookarounds

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

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

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

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

我想我需要类似正则表达式的外观,但不确定如何使用它,或者我理解正确的概念

编辑:解释逻辑

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

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

2 个答案:

答案 0 :(得分:9)

首先你必须捕获左括号,然后使用conditional pattern我知道链接是指向php.net,但我发现它在引用正则表达式时很有用,它还包含一个与你完全匹配的例子case )仅在第一个左括号匹配时才会应用。

模式..

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

匹配

(055)-5555555
(055)5555555 
0555555555

055)-5555555

捕获的小组

  1. 左括号(如果未找到则为空)
  2. 区号(例如55)
  3. 电话号码(例如5555555)
  4. 如何运作

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

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

    如果未找到左括号,则有效忽略该条件。

答案 1 :(得分:3)

仅当开场画面匹配时,才使用(?(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