用于解析所有行的正则表达式以字母数字代码开头,以价格结束

时间:2016-04-07 14:31:16

标签: python regex

我编写了一个小的python脚本来解析大型数据文档的所有行。

我收集了一些类型的行:

LLNNNLL [混合数据和数字] 1.650,00

NNNNNN-LNN [混合数据和数字] 49,00

LLNNNL [混合数据和数字] 208,00

LLNNNLLL [混合数据和数字] 3,00

这是我的正则表达式模式:pattern = "^([A-Z\-0-9]){4,10}.*\d+,\d{2}" 有更准确的方法吗? 例如:我如何指定每行必须至少包含数字和字母?

1 个答案:

答案 0 :(得分:2)

  

如何指定每行必须至少包含数字和字母?

可以在积极向前看的帮助下完成。

pattern = "^(?=[^A-Z]*[A-Z])(?=\D*\d)[A-Z0-9-]{4,10}.*\d+,\d{2}"

(?=[^A-Z]*[A-Z])将在字符串的开头触发,并且字符串中至少需要一个A-Z个字母。 (?=\D*\d)也将被触发(在前一个前瞻返回true之后),并且至少需要一个数字。如果字符串中没有数字,则匹配将失败(不会找到匹配项)。

此外,如果数字必须位于“行”的末尾,请添加$锚点(字符串结尾)。

此外,请注意.*会“占用数字(应该与\d+,\d{2}匹配)直到逗号前的数字,因为.*模式是贪婪的。这里没有区别除非你想要捕获浮点数。然后,使用延迟匹配.*?

如果模式不区分大小写,请在编译模式时使用不区分大小写的标记re.I,或者将(?i)内联修饰符添加到模式开始。

<强>更新

如果要将条件限制为第一个非空白块,可以使用

^(?=[0-9-]*[A-Z])(?=[A-Z-]*\d)[A-Z0-9-]{4,10}.*\d+,\d{2}
    ^^^^^^^         ^^^^^^^

我们检查可选的0+数字/连字符后面是否有一个字母和0+字母或连字符后的数字(见demo)或

^(?=\S*[A-Z])(?=\S*\d)[A-Z0-9-]{4,10}.*\d+,\d{2}

我们在0+非空白字符(\S*)之后检查字母和数字。见another demo