条件正则表达式 - 注意错误

时间:2015-09-14 18:59:00

标签: python regex

我有一个包含任意数量对的字符串:

A = B,C = D,E = F

这是一个选项字符串,所以我知道" A"," C"和" E"。如果我愿意,我可以查询它们。

我想在字符串中找到格式错误的对:

A=B, C, E=F  # C has no equals or value
A=, C=D, E=F # A has no value
A=B, C=D, E=F X # what is X doing there!

当然,A,C和E都是可选的,可以按任何顺序出现。

抓住所有对的优雅方法是什么,同时注意到错误情况?我现在可以使用re.findall(...)抓住对,但我在上面的第三种情况下失败了。

这就是我所拥有的。在我的确切情况下,必须引用该对的右侧,但这对于这个问题并不重要。

re.findall('\s*(\w+)\s*=\s*(?P<Q>[\'\"])(\w*)(P=Q)\s*,{0,1}', a_string)

如果我知道a_string被完全消耗了,我就会很幸福。

3 个答案:

答案 0 :(得分:5)

拆分并打印不在A=B的模式中的字符串。

>>> def malformed(s):
    return [i for i in s.split(', ') if not re.search(r'^[A-Z]+=[A-Z]+$', i)]

>>> print(malformed('A=, C=D, E=F'))
['A=']
>>> print(malformed('A=B, C=D, E=F X'))
['E=F X']
>>> print(malformed('A=B, C, E=F'))
['C']

答案 1 :(得分:2)

如何将它分成两个更容易阅读的测试?

import re

tests = ['A=B, C, E=F'
        ,'A=, C=D, E=F'
        ,'A=B, C=D, E=F X'
        ,'A=B, C=D']


for test in tests:

    print "*", test


    if not re.match("^(\w+=\w+, )*(\w+=\w+)$", test):
        print "Options are malformed"

    options = re.findall("\w+=\w+", test)


    print "Read: ", options
    print

示例输出:

* A=B, C, E=F
Options are malformed
Read:  ['A=B', 'E=F']

* A=, C=D, E=F
Options are malformed
Read:  ['C=D', 'E=F']

* A=B, C=D, E=F X
Options are malformed
Read:  ['A=B', 'C=D', 'E=F']

* A=B, C=D
Read:  ['A=B', 'C=D']

答案 2 :(得分:1)

另一个approuch是尝试直接匹配不适合正则表达式的对,例如:

(?<=,\s|^)(?!\s*\w+=\w+(?=,|$))([^,\n]+)

DEMO