正则表达式捕获格式错误的文本组

时间:2015-10-29 20:04:50

标签: python regex python-2.7

我试图在一些格式错误的文本上应用正则表达式。一般格式为:

descriptor (one|two|three|four) code

理想的输入示例:

hello world (one) 0039x

我想拍摄3组:

"hello world", "one", "0039x"

(注意组(2)中缺少括号)

格式错误的例子:

hello (world) (two) 0039x
hello (world) three 0039x
hello world, four 0039x
hello (world)*,four 0039x

descriptor应保留任何括号和符号(但会忽略逗号),即"hello (world)*"也有效。

以下是我提出的建议:

([a-z0-9 \*\(\)]*),?\s?\(?(one|two|three|four)\)?\s([a-z0-9]+)

它运作正常,但问题是descriptor倾向于贪婪地捕获开括号。即,从理想的例子:

"hello world (", "one", "0039x"

什么是更好的正则表达式,适用于正常情况和畸形案件?前瞻可能很有用,但我不确定如何使用(?:...)并捕获任何括号,如果它也是descriptor的一部分。

2 个答案:

答案 0 :(得分:0)

假设你想在(one|two|three|four)之前匹配直到逗号或空格,你可以使用这个正则表达式:

^(.+?)[\s,]\(?(one|two|three|four)\)?\s([a-z0-9]+)$

RegEx Demo

答案 1 :(得分:0)

你的正则表达式似乎唯一的问题是你的括号是可选的,而你的好/坏样本暗示它们是必需的(删除2 ? s):

([a-z0-9 \*\(\)]*),?\s?\((one|two|three|four)\)\s([a-z0-9]+)