需要正则表达式才能在python中仅获取表名和主键

需要正则表达式才能在python中仅获取表名和主键,python,regex,Python,Regex,也许这个问题很傻,但我无法生成正则表达式来获取表名和主键 表: 我正在使用: begin=re.compile(r“CREATE TABLE[\”]*([^\“]+)[\”]*[([^/;]+)[/;]”),re.IGNORECASE)获取所有表名和数据 但我只需要具有表名和主键的数据 预期输出: dhcpr_dhcprelayinterface PRIMARY KEY(ifName,vrId) 我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教

也许这个问题很傻,但我无法生成正则表达式来获取表名和主键

表: 我正在使用:
begin=re.compile(r“CREATE TABLE[\”]*([^\“]+)[\”]*[([^/;]+)[/;]”),re.IGNORECASE)
获取所有表名和数据

但我只需要具有表名和主键的数据

预期输出:

dhcpr_dhcprelayinterface
PRIMARY KEY(ifName,vrId)

我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教育目的-使用内存数据库-实际创建表并从中获取
表名
,主键列来自:

印刷品:

dhcpr_dhcprelayinterface
['ifName', 'vrId']

我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教育目的-使用内存数据库-实际创建表并从中获取
表名
,主键列来自:

印刷品:

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)')]

您可以使用它来获取表名和主键

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')]

可以找到解释

使用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')]

解释如下

此解决方案解决了一些您似乎不担心的问题(但值得担心的是)例如,SQLite允许您将转义的
'
写为
'
,在
创建
之间,以及
之间,可能有任意数量的空格,甚至换行符(

输出:

('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')

此解决方案解决了一些您似乎不担心的问题(但哪些问题值得担心)例如,SQLite允许您将转义的
'
写为
'
,在
创建
之间,以及
之间,可能有任意数量的空格,甚至换行符(

输出:

('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')

我尝试使用上面的表达式,但它不起作用。谢谢。是否可以使用begin.search(a)而不是findall()打印数据?是的,使用
match=begin.search(a)
返回匹配对象,然后使用
match.groups()获取数据
我有一个变量a,您正在使用它作为一个非常大的SQL语句字符串。我使用了代码的其余部分,但它完全不适用于我。我没有得到任何返回。我尝试使用上面的表达式,但它不起作用。谢谢。是否可以使用begin.search(a)而不是findall()打印数据是的,使用
match=begin.search(a)
返回一个匹配对象,然后使用
match.groups()获取数据
我有一个变量a,您正在使用它作为一个非常大的SQL语句字符串。我使用了代码的其余部分,但它完全不适用于我。我没有得到任何返回。感谢您的良好解释。如果您有想法,请提供regrex表达式。感谢您的良好解释。您可以提供regrex express吗ion如果你有想法。谢谢,是否可以使用re.search()获得输出operation@rishinarian:是。
re.search
将扫描字符串以查找与模式的匹配,返回匹配对象,如果未找到匹配对象,则返回“无”。因此,您可以执行
m=re.search(p,table_string)
,然后
打印[m.group(i+1)对于范围(3)中的i)
。输出为:
['dhcpr\u dhcprelayinterface','ifName','vrId']
。谢谢,可以使用re.search()获取输出吗 operation@rishinarian:是。
re.search
将扫描字符串以查找与模式的匹配项,如果未找到匹配项,则返回匹配对象,或者不返回。因此,您可以执行
m=re.search(p,table_string)
,然后
为范围(3)中的i打印[m.group(i+1)]
。输出为:
['dhcpr\u dhcprelayinterface','ifName','vrId']