我有一个包含任意数量对的字符串:
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
被完全消耗了,我就会很幸福。
答案 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)