4

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

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

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

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

我想我需要一些类似正则表达式的东西,但不确定如何使用它,或者我正确理解了这个概念

编辑:解释逻辑

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

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

4

2 回答 2

9

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

图案..

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

匹配

(055)-5555555
(055)5555555 
0555555555

不是

055)-5555555

捕获的组

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

这个怎么运作

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

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

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

于 2013-03-09T10:07:59.823 回答
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
于 2013-03-09T09:39:08.540 回答