[英]Need regex expression to get only Tably name and primary key in python
可能這個問題很愚蠢,但是我無法生成正則表達式來獲取表名和主鍵。
CREATE TABLE 'dhcpr_dhcprelayinterface' (
'vrId' integer default 0,
'ifName' string ,
PRIMARY KEY(ifName,vrId),
FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCADE);
我正在使用: begin = re.compile(r"CREATE TABLE[ \\"]*([^ \\"]+)[ \\"]*[(]([^/;]+)[/;]",re.IGNORECASE)
以獲取所有表名和數據。
但是我只需要帶有表名和PRIMARY KEY的數據。
預期產量:
dhcpr_dhcprelayinterface
PRIMARY KEY(ifName,vrId)
此解決方案解決了您似乎不擔心(但值得擔心)的一些問題,例如,SQLite允許您將轉義的'
編寫為''
,並且CREATE
和CREATE
之間可以有任意數量的空格,甚至是換行符。 TABLE
以及PRIMARY
, KEY
和(
:之間
s = """\
CREATE TABLE 'dhcpr_dhcprelayinterface' (
'vrId' integer default 0,
'ifName' string ,
PRIMARY KEY(ifName,vrId),
FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId)
ON DELETE CASCADE ON UPDATE CASCADE);
"""
pattern = """
CREATE \s+ TABLE \s+
'((?:[^']|'')*)' # allows escaped single quote
.+ # stuff between table name and primary key
(PRIMARY \s+ KEY\s? \([^)]*\))
"""
mo = re.search(pattern, s, re.IGNORECASE | re.VERBOSE | re.DOTALL)
print(mo.groups())
輸出:
('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')
我敢肯定您可以使用正則表達式或sqlparse
來解決它,但這是一種僅出於教育目的解決問題的“有趣”方法- 在內存數據庫中使用sqlite3
實際創建表並從sqlite_master
內部表獲取table_name
和PRAGMA table_info
主鍵列:
import sqlite3
query = """
CREATE TABLE 'dhcpr_dhcprelayinterface' (
'vrId' integer default 0,
'ifName' string ,
PRIMARY KEY(ifName,vrId),
FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCADE);
"""
db = sqlite3.connect(":memory:")
cursor = db.cursor()
cursor.execute(query)
db.commit()
# get table name
cursor.execute("select name from sqlite_master where type = 'table'")
table_name = cursor.fetchone()[0]
print(table_name)
# get primary key columns
cursor.execute("PRAGMA table_info(%s);" % table_name)
pk_columns = [row[1] for row in cursor.fetchall()[::-1]]
print(pk_columns)
印刷品:
dhcpr_dhcprelayinterface
['ifName', 'vrId']
您可以使用它來獲取表名和主鍵。
begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
begin.findall(YOUR_STR)
輸出:
In [1]: a = """CREATE TABLE 'dhcpr_dhcprelayinterface' (
...: 'vrId' integer default 0,
...: 'ifName' string ,
...: PRIMARY KEY(ifName,vrId),
...: FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON
UPDATE CASCADE);"""
In [2]: begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
In [3]: begin.findall(a)
Out[3]: [('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')]
使用python2.7測試了以下內容:
>>> table_string = """
... CREATE TABLE 'dhcpr_dhcprelayinterface' (
... 'vrId' integer default 0,
... 'ifName' string ,
... PRIMARY KEY(ifName,vrId),
... FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCAD
E);"""
>>> p = r'CREATE TABLE\s+\'([^\']+)[\s\S]+PRIMARY KEY\(([^,]+),([^\)]+)\)'
>>> re.findall(p,table_string)
[('dhcpr_dhcprelayinterface', 'ifName', 'vrId')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.