alo*_*ser 4 python regex regex-lookarounds
开发移动(以色列)电话号码正则表达式.目前我有
re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')
Run Code Online (Sandbox Code Playgroud)
它捕获了大多数用例.只有出现第一个括号时,问题才在于匹配第二个括号.
所以(055)-5555555或(055)5555555或0555555555匹配但是:055)-5555555不会.我知道我可以使用2个正则表达式来测试条件(如果第一个匹配测试另一个条件),但这似乎不是一个聪明的解决方案.
我想我需要像正则表达式的外观,但不知道如何使用它,或者我正确理解这个概念
编辑:解释逻辑
区号:应以5开头,然后是单个数字(来自特定列表),之前选项为零.也可能在括号内.然后是一个可选的连字符和7位数字
澄清:我需要匹配两个括号只有当另一个存在时,对于第一个也是如此,不仅对于第二个,也错过了这一点
首先,您必须捕获左括号,然后使用条件模式(我知道链接是php.net,但我发现它在引用正则表达时很有用,它还包括一个与您的情况完全匹配的示例),只有在第一个左括号匹配.
模式..
^(\()?0?(5[02-9])(?(1)\))-?(\d{7})$
Run Code Online (Sandbox Code Playgroud)
将匹配:
(055)-5555555
(055)5555555
0555555555
Run Code Online (Sandbox Code Playgroud)
但不是:
055)-5555555
Run Code Online (Sandbox Code Playgroud)
该部分(\()?与左括号匹配.这是可选的.
该部分(?(1)\))检查第一个捕获的组(在我们的例子中是左括号)是否匹配,如果是,那么该字符串也必须与右括号匹配.
如果未找到左括号,则实际上忽略该条件.