Поскольку вы упоминаете Group
и ParseResults
, я предполагаю, что вы используете pyparsing. Я обычно ищу тег "pyparsing" для вопросов о pyparsing. Вы можете попробовать реализовать свои изменения в действии синтаксического анализа, а затем использовать transformString
для автоматического изменения.
Вы не описали, какие изменения вы можете захотеть внести, поэтому я вообразил, что значения для каждого OPEN
и CLOSED
были парами XY, и вы, возможно, захотите преобразовать, переведя все значения на + 10000.
Для этого начните с написания парсера только для OPEN/CLOSED
разделы. (Мы используем pyparsing_common.signed_integer
для анализа значений, что также будет выполнять преобразование str-to-int.)
import pyparsing as pp
ppc = pp.pyparsing_common
open_closed_expr = (pp.oneOf("OPEN CLOSED") + pp.restOfLine
+ (ppc.signed_integer * 2)[...]("pairs"))
Затем определите действие синтаксического анализа, чтобы внести это изменение:
# define a parse action to add 10000 to every integer pair value
def modify_integer_pairs(tokens):
updated_pair_values = [x + 10000 for x in tokens.pairs]
# create an updated string to return
first_line = " ".join(tokens[:2])
pairs_string = "\n".join("{} {}".format(*updated_pair_values[i:i+2])
for i in range(0, len(updated_pair_values), 2))
return = first_line + "\n" + pairs_string
open_closed_expr.addParseAction(modify_integer_pairs)
Попробуйте, используя transformString
:
updated_text = open_closed_expr.transformString(text)
print(updated_text)
Дает:
SOT\23 I
37147500 38100000 4 3 1 0 2
OPEN 4 381000 0 1
200500 772000
200500 1153000
2867500 1153000
2867500 -371000
OPEN 2 381000 0 1
200500 -828200
200500 -1780700
OPEN 4 381000 0 1
200500 -3419000
200500 -3800000
2867500 -3800000
2867500 -2276000
CLOSED 5 38100 0 20
-2466500 2105500
5725000 2105500
5725000 -4752500
-2466500 -4752500
-2466500 2105500
VALUE 3810000 3810000 0.000 1 3810000 381000 N LEFT DOWN
Regular <Romansim Stroke Font>
Ref.Des.
VALUE 3810000 3810000 0.000 1 3810000 381000 N LEFT UP
Regular <Romansim Stroke Font>
Part Type
T0 0 0 0 1
T0 -2667000 0 -2667000 2
T3200400 -1333500 3200400 -1333500 3
PAD 0 3
-2 1143000 RF 0.000 1905000 0 0 0
-1 0 R
0 0 R