开发移动(以色列)电话号码正则表达式。目前我有
re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')
可以捕获大多数用例。只有出现第一个括号时,问题才在于匹配第二个括号。
所以(055)-5555555或(055)5555555或0555555555会匹配 但是:055)-5555555不会。 我知道我可以使用2个正则表达式来测试条件(如果第一个匹配测试其他条件)但这似乎不是一个聪明的解决方案。
我想我需要类似正则表达式的外观,但不确定如何使用它,或者我理解正确的概念
编辑:解释逻辑
区号:应以5开头,然后是一位数字(来自特定列表),之前选项为零。也可能在括号内。 然后是一个可选的连字符 和7位数
Clarfication:我需要匹配两个括号,只有当另一个存在时,对于第一个也是如此,不仅对于第二个,错过了那个点
答案 0 :(得分:9)
首先你必须捕获左括号,然后使用conditional pattern(我知道链接是指向php.net,但我发现它在引用正则表达式时很有用,它还包含一个与你完全匹配的例子case )仅在第一个左括号匹配时才会应用。
模式..
^(\()?0?(5[02-9])(?(1)\))-?(\d{7})$
匹配:
(055)-5555555
(055)5555555
0555555555
但不:
055)-5555555
部分(\()?
与左括号匹配。它是可选的。
部分(?(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