在分隔符上具有组的Regex使用可选的或可以包括分隔符的组分隔输入

  • 本文关键字:分隔符 包括 分隔 Regex regex
  • 更新时间 :
  • 英文 :


我需要帮助编写一个带有分组的正则表达式,以匹配以下六个输入字符串:

  1. N.A
  2. 不另行通知
  3. 不另行通知
  4. 不另行通知
  5. N.CX.CY.A
  6. N.CX.CY.A.S

英语中的模式是:

正则表达式的结果应该是四组。给定以上示例:

Group 1 is "N" in all cases
Group 2 is empty in case 1-2, "C" for case 3-4, and "CX.CY" for case 5-6
Group 3 is "A" in all cases
Group 4 is "S" in cases 2,4,6 and emtpy in cases 1,3,5

我在这方面玩过regex打地鼠游戏,我可以把它做对一半,但当我尝试为其他情况更新它时,我最终会破坏以前有效的。

一个解决方案会很棒,但提示或提示同样值得赞赏。

更新2012年3月12日

正如已经指出的,输入2&3看起来相同(根据英文描述),并且4&5看起来一样。

澄清:

在实际输入中,占位符"S"具有一个已知值,即文字字符串"value"。在试图概括这个问题时,我使它无法解决。更新后的英文描述为:

我正在尝试调整以下建议。我没有考虑过使用"环视",所以感谢所有在他们的例子中提出这种技术的人。

让我们看看如何结合您的示例和英语解释:

^(N)(?:.([B-Z][A-Z.]*?))?.(A)(?:.([A-Z.]+))?$

但如果我在python中这样做:

temp = m.split('.A')
if len(temp) == 2:
    g2 = temp[0][2:]
    g4 = temp[1][1:]
else:
    g2, g4 = '', ''
groups = ("N", g2, "A", g4)

将你的"英语模式"翻译成regex语法,这是我得到的最好的:

^(w+)(?:.(w+(?:.w+)?))?.(w+)(?:.(w+))?$

说明:

(w+)          letters
(?:.(
   w+         letters or
   (?:.w+)?  letters dot letters or
))?            nothing
.(w+)        letters
(?:.
   (w+)       letters or
)?             nothing

它适用于情况1,3,5,6,但对于2,4,捕获组是错误的(在卢布中测试):

N.A.S   --> ("N", "A", "S", "")
N.C.A.S --> ("N", "C.A", "S", "")

使第一个非捕获组非贪婪修复了情况2,4,但破坏了情况3,5:

^(w+)(?:.(w+(?:.w+)??))??.(w+)(?:.(w+))?$
N.C.A     --> ("N", "", "C", "A")
N.CX.CY.A --> ("N", "CX", "CY", "A")

我尝试了一些贪婪/非贪婪组的组合,但一无所获。IMHO你需要改进你的规格才能解决这个问题。。。

这里有一个简单的解决方案:

(N).(?:(C(?:X.CY)?).)?(A)(?:.(S))?

我喜欢这个:-)

我认为这个应该奏效:

(N).(C|CX.CY]?)?.?(A)?.?(S)?

这段Python代码似乎适用于您给出的示例。

import re
import sys
r = re.compile("^(N).([A-Z.]*?).?(A).?([A-Z]*)$")
m = r.search(sys.argv[1])
print m.group(1)
print m.group(2)
print m.group(3)
print m.group(4)

相关内容

最新更新