【问题标题】:regex matching char only if a specific char appeared before (conditional regex)正则表达式匹配 char 仅当特定字符出现在之前(条件正则表达式)
【发布时间】:2013-02-24 21:27:01
【问题描述】:

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

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

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

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

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

编辑:解释逻辑

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

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

【问题讨论】:

  • 无需将左括号放在字符组中。 \(? 就够了。
  • regular-expressions.info有很好的解释
  • 你能列出逻辑要求而不是要求我们剖析你的正则表达式吗?
  • h = re.compile(r'^[\(]{0,1}0?(5[023456789])\)?(\-)?\d{7}$')
  • 环顾四周寻找重复的字符,而不是匹配的字符。您应该捕获括号并测试您有 0 或 2。

标签: python regex regex-lookarounds


【解决方案1】:

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

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

(?(1)\)) 部分匹配 \) 如果存在组 1(| no 模式是可选的)。

演示:

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

【讨论】:

  • 不起作用..这匹配不应匹配的 '055)6666666'
  • (?(1)\))替换(?(0)\)|):第一个捕获的组就是你需要的,|和空模式是可选的。
  • @alonisser:是的,测试 0 模式(整个匹配)是个愚蠢的错误。
【解决方案2】:

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

模式..

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

匹配

(055)-5555555
(055)5555555 
0555555555

不是

055)-5555555

捕获的组

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

工作原理

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多