Это то, для чего предназначены парсеры (то есть, проверяя правильный формат):
from parsimonious.grammar import Grammar
data = """
37.1000,-88.1000
37.1000,-88.1000|37.1450,-88.1060
37.1000,-88.1000|37.1450,-88.1060|35.1450,-83.1060
"""
grammar = Grammar(
r"""
line = pair (pipe pair)*
pair = point ws? comma ws? point
point = ~"-?\d+(?:.\d+)?"
comma = ","
pipe = "|"
ws = ~"\s+"
"""
)
for line in data.split("\n"):
try:
grammar.parse(line)
print("Correct format: {}".format(line))
except:
print("Not correct: {}".format(line))
Это даст
Not correct:
Correct format: 37.1000,-88.1000
Correct format: 37.1000,-88.1000|37.1450,-88.1060
Correct format: 37.1000,-88.1000|37.1450,-88.1060|35.1450,-83.1060
Not correct:
Bot Not correct:
операторов, взятых из пустых строк,
Если вы действительно хотите получить значения, вам нужно написать еще один
Visitor
класс:
class Points(NodeVisitor):
grammar = Grammar(
r"""
line = pair (pipe pair)*
pair = point ws? comma ws? point
point = ~"-?\d+(?:.\d+)?"
comma = ","
pipe = "|"
ws = ~"\s+"
"""
)
def generic_visit(self, node, visited_children):
return visited_children or node
def visit_pair(self, node, visited_children):
x, *_, y = visited_children
return (x.text, y.text)
def visit_line(self, node, visited_children):
pairs = [visited_children[0]]
for potential_pair in [item[1] for item in visited_children[1]]:
pairs.append(potential_pair)
return pairs
point = Points()
for line in data.split("\n"):
try:
pairs = point.parse(line)
print(pairs)
except ParseError:
print("Not correct: {}".format(line))