как токенизировать по шаблону регулярных выражений и сортировать полученный список в Python - PullRequest
2 голосов
/ 31 мая 2019

У меня есть файл, который выглядит примерно так

select a,b,c FROM Xtable
select a,b,c FROM Vtable
select a,b,c FROM Atable
select a,b,c FROM Atable
select d,e,f FROM Atable

Я хочу получить sortedMap

{
"Atable":["select a,b,c FROM Atable", "select d,e,f FROM Atable"],
"Vtable":["select a,b,c FROM Vtable"],
"Xtable":["select a,b,c FROM Xtable"]
}

Ключами sortedMap будут tableName, а значения - текстовая строка в списке.

Я начал с этого, но застрял в токенизации строки для соответствия регулярному выражению.

import re

f = open('mytext.txt', 'r')
x = f.readlines()
print x
f.close()
for (i in x):
    p = re.search(".* FROM ", i)
 //now how to tokenize and get the value that follows FROM

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вы можете использовать комбинацию defaultdict и регулярных выражений. Пусть lines будет списком ваших строк:

from collections import defaultdict
pattern = "(select .+ from (\S+).*)"
results = defaultdict(list)

for line in lines:
     query, table = re.findall(pattern, line.strip(), flags=re.I)[0]
     results[table].append(query)

На самом деле правильный способ чтения файла:

with open('mytext.txt') as infile:
    for line in infile:
         query, table = re.findall(pattern, line.strip(), flags=re.I)[0]
         results[table].append(query)

Результат, естественно, defaultdict. Если вы хотите преобразовать его в упорядоченный словарь, вызовите конструктор словаря:

from collections import OrderedDict
OrderedDict(sorted(results.items()))
#OrderedDict([('Atable', ['select a,b,c FROM Atable', ...

Вы можете сделать pattern более надежным, чтобы отслеживать запятые, действительные идентификаторы и т. Д.

1 голос
/ 31 мая 2019

Скорее всего, мы можем не захотеть выполнять эту задачу с помощью регулярных выражений, но если мы это сделаем, мы можем начать с простого выражения, возможно, похожего на:

\"(.+?([a-z]+))\"

Мы бы заменили его на "\2":["\1"],, тогда мы добавим {}.

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\"(.+?([a-z]+))\""

test_str = ("\"select a,b,c FROM Xtable\"\n"
    "\"select a,b,c FROM Vtable\"\n"
    "\"select a,b,c FROM Atable\"\n"
    "\"select a,b,c FROM Atable\"\n"
    "\"select d,e,f FROM Atable\"")

subst = "\"\\2\":[\"\\1\"],"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE | re.IGNORECASE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

RegEx

Если это выражение не требуется, его можно изменить / изменить в regex101.com .

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...