Форум сайта python.su
0
Друзья, я не настоящий сварщик, но у меня есть стремление учиться. Есть задача, которую я могу решить на bash, но не знаю как к ней подступиться на python, помогите, пожалуйста советом.
Итак, есть текстовый файл, в котором повторяются блоки вида:
EOD
PROFILE R_Ti_174 TYPE 1
SNAPPING PARAMETERS 5
5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_174
5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174
5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174
5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174
EOD R_Ti_174
PROFILE R_Ti_174 TYPE 1
SNAPPING PARAMETERS 5
5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_174
5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174
5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174
5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174
Отредактировано knoppix (Сен. 22, 2015 09:57:13)
Офлайн
857
Используй теги кода.
Приведи пример входного блока и выходного блока, который получается.
Офлайн
253
Если файл маленький то:
import re data=open("reg.txt","r").read() rx=re.compile(r"EOD(.+?)TrebsTito (\w+)",re.M|re.DOTALL) data1=re.sub(rx,r"EOD \2\1TrebsTito \2",data) open("reg1.txt","w").write(data1)
with open("reg.txt","r") as f: for i in f: i=i.rstrip() if i=="EOD": j=f.next().rstrip() i+=" "+j.split()[1] print(i) print(j) else: print(i)
Отредактировано doza_and (Сен. 22, 2015 10:27:55)
Офлайн
0
doza_and, спасибо, это работает.
Можешь объяснить что происходит в 3,4 строчках кода?
И что будет, если файл большой?
Отредактировано knoppix (Сен. 22, 2015 10:21:49)
Офлайн
253
knoppixВо второй задается шаблон поиска при помощи регулярных выражений. При этом Флаги выставляем так, чтобы регулярное выражение работало не построчно а во всем тексте. Это чтобы его действие продлилось на несколько строк и можно было выцепить результат из следующих строчек
Можешь объяснить что происходит в 3,4 строчках кода?
Офлайн
0
doza_and
Непонятно почему из 3 строчки. Во второй тоже есть.
Офлайн
857
>>> import re >>> >>> text = """ ... EOD ... PROFILE R_Ti_174 TYPE 1 ... SNAPPING PARAMETERS 5 ... 5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_174 ... 5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174 ... 5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174 ... 5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174 ... ... EOD ... PROFILE R_Ti_175 TYPE 1 ... SNAPPING PARAMETERS 5 ... 5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_175 ... 5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174 ... 5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174 ... 5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174 ... """ >>> >>> out = re.sub(r'EOD(.*?TrebsTito (\S+))', r'EOD \2\1', text, flags=re.S) >>> print(out) EOD R_Ti_174 PROFILE R_Ti_174 TYPE 1 SNAPPING PARAMETERS 5 5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_174 5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174 5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174 5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174 EOD R_Ti_175 PROFILE R_Ti_175 TYPE 1 SNAPPING PARAMETERS 5 5494510.000 1084246.625 0 14 2560.31 5855.34 5855.34 5855 I 2250 TrebsTito R_Ti_175 5494309.500 1084098.875 0 15 2476.59 5845.37 5845.37 5845 I 2250 TrebsTito R_Ti_174 5494300.500 1084402.750 1 14 2664.88 5852.30 5852.30 5852 I 2260 TrebsTito R_Ti_174 5494010.500 1084189.000 1 15 2476.50 5837.89 5837.89 5838 I 2260 TrebsTito R_Ti_174 >>>
Офлайн
857
knoppix
Друг, можешь рассказать подробно, что происходит тут:Спасибо!re.sub(r'EOD(.*?TrebsTito (\S+))', r'EOD \2\1', text, flags=re.S)
r''
r'EOD(.*?TrebsTito (\S+))'
>>> import re >>> >>> match = re.search(r'(.)(.)(.)\1\2\3', 'abcabc') >>> match.group(0) 'abcabc' >>> match.groups() ('a', 'b', 'c') >>>
r'EOD \2\1'
flags=re.S
Отредактировано py.user.next (Сен. 23, 2015 03:55:27)
Офлайн