我需要帮助编写一个带有分组的正则表达式,以匹配以下六个输入字符串:
- N.A
- 不另行通知
- 不另行通知
- 不另行通知
- N.CX.CY.A
- 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)